-
Notifications
You must be signed in to change notification settings - Fork 3
/
BVK_simple_restart_2019.edp
220 lines (196 loc) · 6.09 KB
/
BVK_simple_restart_2019.edp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Calcul de l'ecoulement autour d'un obstacle non profile place dans un canal// la largeur de l'obstacle est fixe a 1 ainsi que la vitesse moyenne// on peut faire varier le rapport de blocage de l'ecoulement// reprise du calcul à partir d'un calcul précédent//
load "iovtk"
load "UMFPACK64";bool restartok=false;
string yes;// lecture du maillage et de la solution précédente
string meshfile,solfile;
cout << "entrer le nom du fichier de maillage : "; cin >> meshfile;
cout << "entrer le nom du fichier de solution : "; cin >> solfile;
mesh th=readmesh(meshfile);
plot(cmm="maillage",th,wait=1);
real[int] bb(4);
boundingbox(th, bb);
cout << "limites du domaine de calcul:" << endl;
cout << "xmin = " << bb[0]
<< ", xmax = " << bb[1]
<< ", ymin = " << bb[2]
<< ", ymax = " << bb[3] << endl;
real bloc;
bloc=bb[3]-bb[2];
real lcanal ;
lcanal=bb[1]-bb[0];
// espaces d'elements finis
fespace Xh(th,P2); // velocity spacefespace Mh(th,P1); // pressure spaceXh u1,u2;
Mh p;
// lecture des champs de pression et de vitesse calcules precedemment{
ifstream pfile(solfile);
pfile >> p[] >> u1[] >> u2[];
}
plot(cmm="champ de pression",p,nbiso=50,fill=true,wait=1);
plot(cmm="champ de vitesse",[u1,u2],wait=1);
real tinit;
int ninit ;
cout << "entrer le temps (adimensionnel) initial : "; cin >> tinit;
// centre de l'obstacle
real xob,yob;
xob=2.*bloc; yob=0.5*bloc;
Xh v1,v2; Xh vor, sigma11, sigma22, sigma12 ;Mh q;// definition de la condition aux limites en entre du canal// profil de vitesse parabolique// u1(y=0) = 0 ; u1(y=bloc) = 0 : vitesse moyenne <u1> = 1func uin=6*y*(bloc-y)/(bloc*bloc) ;
//func uin=1 ; // definition du calcul de la fonction de courantXh psi,phi;problem streamlines(psi,phi) =int2d(th)( dx(psi)*dx(phi) + dy(psi)*dy(phi))+ int2d(th)( -phi*(dy(u1)-dx(u2)))+ on(1,psi=0);
// nu est l'inverse du nb de Reynolds// attention a la definition de Reynolds. real reynolds ;cout << " Entrer le nombre de Reynolds :"; cin >> reynolds;real nu=1./reynolds;// definition du pas de tempsreal dt=0.1;
cout << "Pas de temps : " << dt << "\n";
// numéro d'itération initiale
ninit=floor(tinit/dt);
//
// raffinement automatique du maillage ou pas ?
bool refinemesh=false;
cout << " Raffinement automatique du maillage pendant le calcul ? (o,n)"; cin >> yes;
if (yes == "o") refinemesh=true;
//real alpha=1/dt;// definition du probleme de Navier-Stokes// la condition aux limites sur la face d'entree dans le canal (d) prend en compte la perturbation de vitesse// dependant du temps (=dt*i)Xh up1,up2;
int i;problem NS (u1,u2,p,v1,v2,q,solver=UMFPACK,init=i) =int2d(th)(alpha*( u1*v1 + u2*v2)+ nu * ( dx(u1)*dx(v1) + dy(u1)*dy(v1)+ dx(u2)*dx(v2) + dy(u2)*dy(v2) )- p*q*(0.000001)- p*dx(v1) - p*dy(v2)- dx(u1)*q - dy(u2)*q)+ int2d(th) ( -alpha*convect([up1,up2],-dt,up1)*v1 -alpha*convect([up1,up2],-dt,up2)*v2 )+ on(4,u1=uin,u2=0) + on(2,u2=0)+ on(1,3,5,u1=0,u2=0);//// definition des valeurs pour la visualisation de la vorticite de -vmax vmaxreal[int] vorval(51);real vmax=10;for (i=0;i<51;i++){ vorval[i]=vmax*(-1.+0.04*i);}
// definition des couleurs pour l'affichage de la vorticite
// les couleurs sont definies par leur coordonnees hsv (hue, saturation, value ; teinte, saturation, luminosite) qui varient entre 0 et 1
real[int] colors(153) ;
for (i=0;i<26;i++){
colors[3*i]=0.008*i;
//colors[3*i+1]=1-0.04*i;
colors[3*i+1]=1;
colors[3*i+2]=1;
}
for (i=26;i<51;i++){
colors[3*i]=0.5+0.008*(i-26);
//colors[3*i+1]=0.04*(i-25);
colors[3*i+1]=1;
colors[3*i+2]=1;
}
// fichier de sortie pour le'volution temporelle de la force sur l'obstaclestring fvstfile="f_vs_t_b"+bloc+"_re"+reynolds+"_ti"+tinit+ ".txt" ;ofstream fvst(fvstfile,append);
// fichiers de sortie des donnees au format vtk pour affichage avec Paraview
string omegatkfile,vtkfile,ptkfile,psitkfile;// nombre d'iterations en tempsint nbiter ;cout << " Entrer le nombre d iterations :"; cin >> nbiter; // definition des paramtres pour les sorties graphiquesbool calcf =true ;real fx,fy ;bool sortiep=true, sortiev=true, zoom=true, sortier=true;real llx,lly,urx,ury;llx=15. ;lly=0. ;urx=60. ;ury=bloc ;
// definition des vecteurs pour l'affichage force et vitesse en fonction du tempsreal[int] temps(nbiter),fox(nbiter),foy(nbiter) ;for (i=0;i<nbiter;i++){ temps[i]=tinit+dt*i; fox[i]=0 ; foy[i]=0 ;}
// nouveau numero d'iteration
int in;// off we go, iteration en tempsfor (i=0;i<nbiter;i++){
in=i+ninit; up1=u1; up2=u2; NS;
// calcul des contraintes et de la force sur l'obstacle if (calcf){ sigma11=2*nu*dx(u1)-p; sigma22=2*nu*dy(u2)-p ; sigma12=nu*(dy(u1)+dx(u2)); fx=-int1d(th,5) (sigma11*N.x+sigma12*N.y); fy=-int1d(th,5) (sigma12*N.x+sigma22*N.y);
fox[i]=fx;
foy[i]=fy; fvst << in << "," << fx << "," << fy << "\n"; }
plot(cmm="Forces sur l'obstacle iteration no "+in+" temps "+dt*in,[temps,fox],[temps,foy]); if ( !(i % 10)) { vor = dy(u1)-dx(u2); if (sortiep) {
plot(cmm="iteration no "+in+" temps "+dt*in,p,nbiso=50,fill=1,bb=[[llx,lly],[urx,ury]]);
ptkfile="p_b"+bloc+"_re"+reynolds+"_t"+in+".vtk";
savevtk(ptkfile,th,p,dataname="pression"); } if (sortiev) { // calcul de la fonction de courant de l'ecoulement streamlines ;
plot (cmm="iteration no "+in+" temps "+dt*in,psi,nbiso=50,bb=[[llx,lly],[urx,ury]]);
vtkfile="vit_b"+bloc+"_re"+reynolds+"_t"+in+".vtk";
savevtk(vtkfile,th,[u1,u2],dataname="vitesse"); } if (sortier) {
plot(cmm="iteration no "+in+" temps "+dt*in,vor,viso=vorval,hsv=colors,fill=1,bb=[[llx,lly],[urx,ury]]);
omegatkfile="vor_b"+bloc+"_re"+reynolds+"_t"+in+".vtk";
savevtk(omegatkfile,th,vor,dataname="vorticite"); } }
if (refinemesh) {
// adaptation du maillage et interpolation des fonctions sur le nouveau maillage
th=adaptmesh(th,u1,u2,hmin=0.01);
u1=u1;
u2=u2;
p=p;
}}
// sauvegarde du maillage final et des champs de vitesse et de pression
meshfile="mesh_b"+bloc+"_re"+reynolds+"_t"+in+".msh";
solfile="pu_b"+bloc+"_re"+reynolds+"_t"+in+".sol";
savemesh(th,meshfile);
{
ofstream solf(solfile);
solf << p[] << u1[] << u2[] << endl ;
}