5 &(f,ftild,fn,fscexp,dift,iconvf,conv,
6 & h,hn,hprop,uconv,vconv,dm1,zconv,solsys,
7 & visc,visc_s,sm,smh,yasmh,smi,yasmi,am1,am2,
8 & zf,fbor,afbor,bfbor,limtra,masktr,mesh,tb,
9 & t1,t2,t4,t10,te1,te2,te3,kdir,kddl,dt,entet,
10 & tetat,agglot,infogt,
bilan,optadv,
11 & isousi,opdtra,optban,msk,maskel,maskpt,mbor,
12 & s,massou,optsou,slvtra,flbor,volu2d,v2dpar,unsv2d,optvf,flbortra,
13 & flulim,yaflulim,flulimebe,yaflulimebe,dirflu,rain,pluie,train,
14 & given_flux,flux_given,maxadv,tb2,nco_dist,nsp_dist)
274 & adv_lpo,adv_nsc_tf,adv_psi_tf,adv_lpo_tf,adv_void
281 INTEGER,
INTENT(IN) :: ICONVF,ISOUSI,OPTADV,OPDTRA
282 INTEGER,
INTENT(IN) :: OPTBAN,OPTSOU,KDIR,SOLSYS
283 INTEGER,
INTENT(IN) :: KDDL,OPTVF,DIRFLU,MAXADV
284 INTEGER,
INTENT(IN) :: NCO_DIST,NSP_DIST
285 DOUBLE PRECISION,
INTENT(IN) :: TETAT,AGGLOT,DT,TRAIN
286 DOUBLE PRECISION,
INTENT(INOUT) :: MASSOU
287 LOGICAL,
INTENT(IN) :: INFOGT,BILAN,CONV,YASMH,RAIN
288 LOGICAL,
INTENT(IN) :: DIFT,MSK,ENTET,YASMI,YAFLULIM
289 LOGICAL,
INTENT(IN) :: FLUX_GIVEN,YAFLULIMEBE
290 TYPE(slvcfg),
INTENT(INOUT) :: SLVTRA
291 TYPE(bief_obj),
INTENT(IN) :: MASKEL,MASKPT,H,HN,AFBOR,BFBOR
292 TYPE(bief_obj),
INTENT(IN),
TARGET :: HPROP
293 TYPE(bief_obj),
INTENT(INOUT) :: F,SM,FLBORTRA
294 TYPE(bief_obj),
INTENT(IN) :: UCONV,VCONV,ZF
295 TYPE(bief_obj),
INTENT(IN) :: FTILD,FN,SMI,FLULIM,PLUIE
296 TYPE(bief_obj),
INTENT(IN) :: FLULIMEBE
297 TYPE(bief_obj),
INTENT(INOUT) :: SMH,FBOR
298 TYPE(bief_obj),
INTENT(INOUT) :: TE1,TE2,TE3
299 TYPE(bief_obj),
INTENT(INOUT) :: T1,T2,T4
300 TYPE(bief_obj),
INTENT(INOUT),
TARGET :: T10
301 TYPE(bief_obj),
INTENT(IN) :: FSCEXP,DM1,ZCONV
302 TYPE(bief_obj),
INTENT(IN) :: S,V2DPAR,UNSV2D,VOLU2D
303 TYPE(bief_obj),
INTENT(INOUT) :: FLBOR,LIMTRA
304 TYPE(bief_obj),
INTENT(INOUT) :: VISC_S,VISC
305 TYPE(bief_obj),
INTENT(INOUT) :: AM1,AM2,MBOR
306 TYPE(bief_obj),
INTENT(INOUT) :: TB,TB2
307 TYPE(bief_obj),
INTENT(IN) :: MASKTR,GIVEN_FLUX
308 TYPE(bief_mesh) :: MESH
312 DOUBLE PRECISION C,TETATD
314 INTEGER IELMF,IELMH,IELMS,MSKNEU,I,N,IOPT,DIMGLO
316 LOGICAL MSQ,FV_SCHEME
318 CHARACTER(LEN=16) FORMUL
320 TYPE(bief_obj),
POINTER :: HPR
335 dimglo=mesh%GLOSEG%DIM1
342 IF( iconvf.EQ.adv_lpo.OR.iconvf.EQ.adv_lpo_tf.OR.
343 & iconvf.EQ.
adv_nsc.OR.iconvf.EQ.adv_nsc_tf.OR.
344 & iconvf.EQ.
adv_psi.OR.iconvf.EQ.adv_psi_tf )
THEN 352 IF(ielmf.NE.ielms)
THEN 353 CALL chgdis(sm ,ielms,ielmf,mesh)
355 IF(ielmf.NE.ielmh.AND.yasmh)
THEN 356 CALL chgdis(smh ,ielmh,ielmf,mesh)
366 IF(ielmf.NE.ielmh)
THEN 367 CALL os(
'X=Y ' , x=t10 , y=hprop )
368 CALL chgdis(t10,ielmh,ielmf,mesh)
379 IF(isousi.EQ.1)
CALL os(
'X=Y ' , x=f , y=fn )
386 IF(iconvf.EQ.
adv_sup.AND.conv)
THEN 390 CALL matrix(am2,
'M=N ',
'MATVGR ',ielmf,ielmf,
391 & 1.d0,s,s,s,uconv,vconv,s,
398 CALL ksupg(te1,te2,1.d0,uconv,vconv,mesh)
399 CALL matrix(am2,
'M=M+N ',
'MASUPG ',ielmf,ielmf,
400 & 1.d0,te1,te2,s,uconv,vconv,s,mesh,msk,maskel)
402 ELSEIF(optadv.EQ.2)
THEN 404 CALL matrix(am2,
'M=M+N ',
'MAUGUG ',ielmf,ielmf,
405 & 0.5d0*dt,s,s,s,uconv,vconv,s,mesh,msk,maskel)
406 ELSEIF(optadv.NE.0)
THEN 407 WRITE(
lu,*)
'CVDFTR: UNKNOWN OPTION FOR SUPG =',optadv
418 IF(dift.OR..NOT.fv_scheme.OR..NOT.conv.OR.bilan)
THEN 420 IF(optban.EQ.1.OR.optban.EQ.3)
THEN 421 CALL os(
'X=Y+Z ',x=t2,y=zf,z=hn)
422 CALL decvrt(te3,t2,zf,mesh)
427 IF(msk)
CALL os(
'X=XY ',x=te3,y=maskel)
432 IF(msk)
CALL os(
'X=Y ',x=te3,y=maskel)
435 CALL matrix(am1,
'M=N ',formul,ielmf,ielmf,
436 & 1.d0/dt,te3,s,s,s,s,s,mesh,msk,maskel)
440 IF(agglot.GT.0.001d0)
THEN 441 CALL lump(t1,am1,mesh,agglot)
442 CALL om(
'M=CM ', m=am1, c=1.d0-agglot, mesh=mesh)
443 CALL om(
'M=M+D ', m=am1, d=t1, mesh=mesh)
459 IF(.NOT.fv_scheme)
THEN 460 CALL os(
'X=CY ' , x=t2 , y=sm , c=dt )
467 IF(iconvf.EQ.
adv_car.OR..NOT.conv)
THEN 469 CALL os(
'X=X+Y ' , x=t2 , y=ftild )
470 CALL matvec(
'X=AY ',sm,am1,t2,c,mesh)
474 ELSEIF(iconvf.EQ.
adv_sup.AND.conv)
THEN 478 IF(am1%TYPEXT.NE.
'Q')
THEN 479 CALL om(
'M=X(M) ', m=am1, mesh=mesh)
487 CALL matrix(am1,
'M=M+TN ',
'MATVGR ',ielmf,ielmf,
488 & 1.d0/dt,s,s,s,te1,te2,s,mesh,msk,maskel)
490 ELSEIF(optadv.EQ.2)
THEN 492 CALL matrix(am1,
'M=M+TN ',
'MATVGR ',ielmf,ielmf,
493 & 0.5d0,s,s,s,uconv,vconv,s,mesh,msk,maskel)
494 ELSEIF(optadv.NE.0)
THEN 495 WRITE(
lu,*)
'CVDFTR: UNKNOWN OPTION FOR SUPG =',optadv
502 CALL os(
'X=X+Y ' , x=t2 , y=fn )
503 CALL matvec(
'X=AY ',sm,am1,t2,c,mesh)
507 CALL matvec(
'X=X+CAY ',sm,am2,fn,tetat-1.d0,mesh)
511 CALL om(
'M=M+CN ', m=am1, n=am2, c=tetat, mesh=mesh)
515 ELSEIF( (iconvf.EQ.adv_lpo.OR.
517 & iconvf.EQ.
adv_psi ).AND.conv )
THEN 527 IF(iconvf.EQ.adv_lpo) iopt=iopt+2
528 IF(iconvf.EQ.
adv_nsc) iopt=iopt+2
529 IF(iconvf.EQ.
adv_psi) iopt=iopt+3
532 WRITE(
lu,*)
'SIZE OF TB TOO SMALL IN CVDFTR' 536 CALL cvtrvf(f,fn,fscexp,h,hn,hprop,uconv,vconv,
537 & dm1,zconv,solsys,sm,smh,yasmh,smi,yasmi,
538 & fbor,masktr,mesh,agglot,dt,entet,
539 & msk,maskel,s,massou,optsou,
541 & limtra%I,kdir,kddl,mesh%NPTFR,flbor,.true.,
542 & volu2d,v2dpar,unsv2d,iopt,flbortra,maskpt,
543 & rain,pluie,train,optadv,tb,12,am2,tb2,
544 & nco_dist,nsp_dist,yaflulim,flulim%R,
545 & yaflulimebe,flulimebe%R,slvtra)
549 CALL matvec(
'X=AY ',sm,am1,f,c,mesh)
553 ELSEIF( (iconvf.EQ.adv_lpo_tf.OR.
554 & iconvf.EQ.adv_nsc_tf.OR.
555 & iconvf.EQ.adv_psi_tf ).AND.conv )
THEN 563 WRITE(
lu,*)
'SIZE OF TB TOO SMALL IN CVDFTR' 564 WRITE(
lu,*)
'FOR CALLING CVTRVF_NERD AND CVTRVF_ERIA' 568 IF(iconvf.EQ.adv_lpo_tf.OR.
569 & iconvf.EQ.adv_nsc_tf)
THEN 573 CALL cvtrvf_nerd(f,fn,fscexp,h,hn,hprop,uconv,vconv,
574 & dm1,zconv,solsys,sm,smh,yasmh,smi,yasmi,
576 & tb%ADR(13)%P,tb%ADR(14)%P,tb%ADR(15)%P,
577 & tb%ADR(16)%P,tb%ADR(17)%P,tb%ADR(18)%P,
578 & tb%ADR(19)%P,tb%ADR(20)%P,
579 & dt,entet,msk,maskel,optsou,
581 & limtra%I,kdir,kddl,mesh%NPTFR,flbor,.true.,
582 & unsv2d,iopt,flbortra,
583 & mesh%GLOSEG%I( 1: dimglo),
584 & mesh%GLOSEG%I(dimglo+1:2*dimglo),
585 & mesh%NBOR%I,flulim%R,yaflulim,rain,pluie,
586 & train,given_flux,flux_given,maxadv)
588 ELSEIF(iconvf.EQ.adv_psi_tf)
THEN 592 CALL cvtrvf_eria(f,fn,fscexp,h,hn,hprop,uconv,vconv,
593 & dm1,zconv,solsys,sm,smh,yasmh,smi,yasmi,
595 & tb%ADR(13)%P,tb%ADR(14)%P,tb%ADR(15)%P,
596 & tb%ADR(16)%P,tb%ADR(17)%P,tb%ADR(18)%P,
597 & tb%ADR(19)%P,tb%ADR(20)%P,
598 & dt,entet,msk,maskel,optsou,
600 & limtra%I,kdir,kddl,mesh%NPTFR,flbor,.true.,
601 & unsv2d,iopt,flbortra,
602 & mesh%NBOR%I,rain,pluie,
603 & train,maxadv,nco_dist,optadv)
611 CALL matvec(
'X=AY ',sm,am1,f,c,mesh)
615 ELSEIF( iconvf.EQ.adv_void.AND.conv )
THEN 617 CALL os(
'X=Y ' , x=f, y=fn)
618 CALL os(
'X=X+Y ' , x=t2 , y=fn )
619 CALL matvec(
'X=AY ',sm,am1,t2,c,mesh)
624 WRITE(
lu,*)
'CVDFTR: UNKNOWN ADVECTION OPTION : ',iconvf
644 CALL os(
'X=Y ',x=visc_s,y=visc)
646 CALL ov_2(
'X=XY ',visc%R,1,hpr%R,1,hpr%R,1,c,
647 & visc%MAXDIM1,visc%DIM1)
648 IF(visc%DIM2.EQ.3)
THEN 649 CALL ov_2(
'X=XY ',visc%R,2,hpr%R,1,hpr%R,1,c,
650 & visc%MAXDIM1,visc%DIM1)
651 CALL ov_2(
'X=XY ',visc%R,3,hpr%R,1,hpr%R,1,c,
652 & visc%MAXDIM1,visc%DIM1)
658 CALL matrix(am2,
'M=N ',
'MATDIF MON',ielmf,ielmf,
659 & 1.d0,s,s,s,visc,s,s,mesh,msq,te3)
663 CALL os(
'X=1/Y ',x=t4,y=hpr,
664 & iopt=2,infini=0.d0,zero=1.d-2)
665 CALL om(
'M=X(M) ', m=am2, mesh=mesh )
666 CALL om(
'M=DM ', m=am2, d=t4, mesh=mesh)
668 CALL os(
'X=Y ',x=visc,y=visc_s)
675 IF(mesh%NELEB.GT.0)
THEN 676 CALL matrix(mbor,
'M=N ',
'FMATMA ',
678 & -1.d0,afbor,s,s,s,s,s,
679 & mesh,.true.,masktr%ADR(mskneu)%P)
680 CALL om(
'M=M+N ', m=am2, n=mbor, mesh=mesh)
685 IF(am1%TYPEXT.NE.
'Q'.AND.am2%TYPEXT.EQ.
'Q')
THEN 686 CALL om(
'M=X(M) ', m=am1, mesh=mesh)
689 IF(tetatd.NE.1.d0)
THEN 691 CALL matvec(
'X=AY ',t1,am2,fn,c,mesh)
692 CALL os(
'X=X+CY ' , x=sm , y=t1 , c=tetatd-1.d0 )
694 CALL om(
'M=M+CN ', m=am1, n=am2, c=tetatd, mesh=mesh)
697 CALL om(
'M=M+N ', m=am1, n=am2, mesh=mesh)
703 & 1.d0,bfbor,s,s,s,s,s,mesh,
704 & .true.,masktr%ADR(mskneu)%P)
705 CALL osdb(
'X=X+Y ' , sm , t2 , t2 , c , mesh )
713 IF(yasmh.AND..NOT.(fv_scheme.AND.conv))
THEN 716 CALL vector(t2,
'=',
'MASVEC ',ielmf,
717 & 1.d0,smh,s,s,s,s,s,mesh,msk,maskel)
718 CALL os(
'X=Y/Z ',x=t1,y=t2,z=hpr,
719 & iopt=2,infini=0.d0,zero=1.d-3)
722 CALL os(
'X=CX ', x=t1 , c=tetat )
723 CALL om(
'M=M+D ', m=am1, d=t1, mesh=mesh)
725 CALL os(
'X=YZ ', x=t1 , y=smh , z=fscexp)
726 CALL vector(t2,
'=',
'MASVEC ',ielmf,
727 & 1.d0,t1,s,s,s,s,s,mesh,msk,maskel)
728 CALL os(
'X=Y/Z ',x=t1,y=t2,z=hpr,
729 & iopt=2,infini=0.d0,zero=1.d-3)
730 CALL os(
'X=X+Y ', x=sm , y=t1)
731 ELSEIF(optsou.EQ.2)
THEN 732 CALL os(
'X=Y/Z ',x=t1,y=smh,z=hpr,
733 & iopt=2,infini=0.d0,zero=1.d-3)
736 CALL os(
'X=X+YZ ', x=sm , y=t1 , z=fscexp)
739 CALL os(
'X=CX ', x=t1, c=tetat)
740 CALL om(
'M=M+D ', m=am1, d=t1, mesh=mesh)
747 IF(rain.AND..NOT.(fv_scheme.AND.conv))
THEN 749 CALL vector(t2,
'=',
'MASVEC ',ielmf,
750 & 1.d0,pluie,s,s,s,s,s,mesh,msk,maskel)
751 CALL os(
'X=Y/Z ' ,x=t1,y=t2,z=hpr,
752 & iopt=2,infini=0.d0,zero=1.d-3)
755 CALL os(
'X=CX ',x=t1,c=tetat)
756 CALL om(
'M=M+D ', m=am1, d=t1, mesh=mesh)
758 CALL os(
'X=CYZ ',x=t1,y=pluie,z=fn,c=tetat-1.d0)
760 IF(abs(train).GT.1.d-15)
THEN 763 t1%R(i)=t1%R(i)+max(pluie%R(i),0.d0)*train
766 CALL vector(t2,
'=',
'MASVEC ',ielmf,
767 & 1.d0,t1,s,s,s,s,s,mesh,msk,maskel)
768 CALL os(
'X=Y/Z ',x=t1,y=t2,z=hpr,
769 & iopt=2,infini=0.d0,zero=1.d-3)
770 CALL os(
'X=X+Y ',x=sm,y=t1)
782 IF(yasmi.AND..NOT.(fv_scheme.AND.conv))
THEN 783 CALL matrix(am2,
'M=N ',
'MATMAS ',ielmf,ielmf,
784 & -1.d0,s,s,s,s,s,s,mesh,msk,maskel)
786 IF(agglot.GT.0.001d0)
THEN 787 CALL lump(t1,am2,mesh,agglot)
788 CALL om(
'M=CM ', m=am2, c=1.d0-agglot, mesh=mesh)
789 CALL om(
'M=M+D ', m=am2, d=t1, mesh=mesh)
796 t4%R(i)=smi%R(i)/max(h%R(i),1.d-4)
800 CALL os(
'X=Y/Z ',x=t4,y=smi,z=h)
802 CALL om(
'M=X(M) ', m=am2, mesh=mesh)
803 CALL om(
'M=MD ', m=am2, d=t4, mesh=mesh)
805 IF(am1%TYPEXT.NE.
'Q')
THEN 806 CALL om(
'M=X(M) ', m=am1, mesh=mesh)
808 CALL om(
'M=M+N ', m=am1, n=am2, mesh=mesh)
813 IF(iconvf.EQ.
adv_car.AND..NOT.dift)
THEN 814 CALL os(
'X=Y ', x=f, y=ftild)
827 IF(.NOT.fv_scheme.OR.dirflu.EQ.1)
THEN 828 CALL dirich(f, am1, sm,fbor,limtra%I,tb,mesh,kdir,msk,maskpt)
836 CALL ad_solve(f,am1,sm,tb,slvtra,infogt,mesh,am2)
839 CALL solve(f,am1,sm,tb,slvtra,infogt,mesh,am2)
845 IF(yasmi.AND.bilan)
THEN 846 IF(yasmi.AND..NOT.(fv_scheme.AND.conv))
THEN 850 CALL matvec(
'X=AY ',t2,am2,f,c,mesh)
853 massou = massou - dt*
p_dots(t2,hprop,mesh)
855 massou = massou - dt*
dots(t2,hprop)
857 ELSEIF(yasmi.AND.(fv_scheme.AND.conv))
THEN 862 c = c + dt*smi%R(i)*f%R(i)*volu2d%R(i)
864 IF(ncsize.GT.1) c=
p_sum(c)
873 IF(.NOT.fv_scheme)
THEN 876 flbortra%R(i)=flbor%R(i)*(tetat*f%R(n)+(1.d0-tetat)*fn%R(n))
884 IF(ielmf.NE.ielms)
CALL chgdis(sm ,ielmf,ielms,mesh)
885 IF(ielmf.NE.ielmh.AND.yasmh)
CALL chgdis(smh ,ielmf,ielmh,mesh)
subroutine ad_solve(X, A, B, TB, CFG, INFOGR, MESH, AUX)
integer, parameter adv_psi
integer, parameter adv_sup
subroutine solve(X, A, B, TB, CFG, INFOGR, MESH, AUX)
subroutine chgdis(X, OLDELT, NEWELT, MESH)
subroutine ov_2(OP, X, DIMX, Y, DIMY, Z, DIMZ, C, DIM1, NPOIN)
subroutine om(OP, M, N, D, C, MESH)
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)
integer, parameter adv_nsc
subroutine cvtrvf_eria(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, NBOR, RAIN, PLUIE, TRAIN, NITMAX, NCO_DIST, OPTADV)
integer function ielbor(IELM, I)
subroutine cvdftr(F, FTILD, FN, FSCEXP, DIFT, ICONVF, CONV, H, HN, HPROP, UCONV, VCONV, DM1, ZCONV, SOLSYS, VISC, VISC_S, SM, SMH, YASMH, SMI, YASMI, AM1, AM2, ZF, FBOR, AFBOR, BFBOR, LIMTRA, MASKTR, MESH, TB, T1, T2, T4, T10, TE1, TE2, TE3, KDIR, KDDL, DT, ENTET, TETAT, AGGLOT, INFOGT, BILAN, OPTADV, ISOUSI, OPDTRA, OPTBAN, MSK, MASKEL, MASKPT, MBOR, S, MASSOU, OPTSOU, SLVTRA, FLBOR, VOLU2D, V2DPAR, UNSV2D, OPTVF, FLBORTRA,
subroutine matrix(M, OP, FORMUL, IELM1, IELM2, XMUL, F, G, H, U, V, W, MESH, MSK, MASKEL)
double precision function dots(X, Y)
subroutine dirich(F, S, SM, FBOR, LIMDIR, WORK, MESH, KDIR, MSK, MASKPT)
subroutine vector(VEC, OP, FORMUL, IELM1, XMUL, F, G, H, U, V, W, MESH, MSK, MASKEL, LEGO, ASSPAR)
subroutine decvrt(TETA, SL, ZF, MESH)
subroutine osdb(OP, X, Y, Z, C, MESH)
subroutine bilan(MESH, H, WORK, AT, DT, LT, NIT, INFO, MASSES, MSK, MASKEL, EQUA, POROSS, OPTBAN, NPTFR, FLBOR, FLUX_BOUNDARIES, NUMLIQ, NFRLIQ, GAMMA)
subroutine ksupg(KX, KY, XMUL, U, V, MESH)
integer, parameter adv_car
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
subroutine parcom(X, ICOM, MESH)
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)
subroutine matvec(OP, X, A, Y, C, MESH, LEGO)
double precision function p_dots(X, Y, MESH)
subroutine lump(DIAG, A, MESH, XMUL)