On s'intéresse aux oscillations de la surface d'un liquide contenu dans un réservoir. Au repos le réservoir contient un liquide sur une hauteur . La surface du liquide est plane, horizontale et notée . La répartition de pression dans le liquide est hydrostatique:
On perturbe la surface à l'instant initiale. Celle ci se met alors à osciller de part et d'autre de sa position initiale . On néglige les effets de viscosité, et on applique les équations de conservation de la masse et de la quantité de mouvement à un cylindre élémentaire de base et de hauteur (figure 4.7).
En notant la vitesse moyenne (suivant z) et la densité, le bilan de masse pour le cylindre de volume s'écrit:
De même le bilan de quantité de mouvement s'écrit:
0 | |||
0 |
En notant que , et en linéarisant les équations précédentes ( , , ), il vient:
En dérivant la première équation par rapport à , la seconde par rapport à et la troisième par rapport à , on obtiens l'équation de propagation de la perturbation de la surface libre en éliminant et :
C'est une équation des ondes qui traduit la propagation d'ondes de surface avec une célérité .
A cette équation, il faut ajouter une condition aux limites sur la frontière du réservoir. La condition physique est la condition de vitesse normale nulle sur . Pour obtenir une condition sur , on utilise la combinaison suivant des 2 dernières équations (4.7):
d'où l'on déduit la condition aux limites sur :
Les conditions initiales sont données par la déformation initiale et la vitesse de cette déformation. En supposant la vitesse de déformation initiale nulle, on a donc:
Le problème modèle associé s'écrit:
Trouvez
tel que
Dans le cas d'un domaine
circulaire de rayon
, on
peut avantageusement passer en coordonnées polaires
.
Le problème modèle s'écrit:
Trouver
tel que:
dans | (4.12) |
Dans la cas cylindrique (4.12), on a cherché la solution analytique à l'aide du programme Maple (4.3.2).
> restart;with(plots): # Equation des ondes en polaire > diff(u(r,theta,t),t$2)=c0^2/r*diff(r*diff(u(r,theta,t),r),r) +c0^2/r^2*diff(u(r,theta,t),theta$2); > eq:=%: # Solutions en variables séparées de type onde periodique en theta > u(r,theta,t)=A(r)*exp(I*k*theta)*exp(I*lambda*c0*t); > subs(%,eq):simplify(%/exp(I*k*theta)/exp(I*lambda*c0*t)/c0^2); eq1:=%: > rhs(eq1)-lhs(eq1);eq2:=%: > dsolve(eq2,A(r)); # Modes propres > Ue:=(r,theta,t)->BesselJ(k,lambda*r)*exp(I*k*theta)*exp(I*lambda*c0*t); > subs(r=1,diff(Ue(r,theta,t),r)); # Pour chaque valeur de k, on calcule les racines lambda > -BesselJ(k+1,lambda)+k*BesselJ(k,lambda)/lambda=0; eq3:=lhs(%): > plot({subs(k=0,eq3),subs(k=1,eq3),subs(k=2,eq3)},lambda=0..20); > Um:=(k,p)->BesselJ(k,lambda[k,p]*r)*exp(I*k*theta)*exp(I*lambda[k,p]*c0*t); > Uex=sum(sum(C[k,p]*Um(k,p),p=0..M),k=0..N); # Conditions initiales particulieres (avec c0=1) # 1/ mode radial > lambda1:=fsolve(subs(k=0,eq3),lambda,10..12); > Uex1:=BesselJ(0,lambda1*r)*cos(lambda1*t); > animate3d([r*cos(theta),r*sin(theta),Uex1],r=0..1,theta=0..2*Pi, t=0..2*(2*Pi/lambda1),frames=50); # 2/ mode angulaire > lambda2:=fsolve(subs(k=1,eq3),lambda,6..10); > Uex2:=BesselJ(1,lambda2*r)*cos(lambda2*t)*cos(theta);; > animate3d([r*cos(theta),r*sin(theta),Uex2],r=0..1,theta=0..2*Pi, t=0..2*(2*Pi/lambda2),frames=50);
On a cherché une solution élémentaire à variables séparées sous la forme d'une onde se propageant à une célérité et périodique en (ligne 7):
En reportant dans l'équation, on obtiens une équation de Bessel (ligne 9) pour :
dont Maple nous fournit la solution générale avec la fonction dsolve (ligne 11). Cette solution générale est une combinaison linéaire de fonctions de Bessel de première et deuxième espèce: et . De ces deux familles de fonctions de Bessel, on ne retient que la famille , qui est la seule a avoir une valeur finie (égale à 1) en . La solution élémentaire s'écrit (ligne 13)
Cette solution élémentaire doit vérifier la condition à la limite en (ligne 14), ce qui impose pour chaque valeur de des valeurs de particulières. Les valeurs possibles de sont les racines de la fonction (ligne 16):
On a tracé cette fonction pour différentes valeur de k sur la figure (4.8). Pour une valeur de fixé, on a une infinité de racines (c'est l'équivalent des racines des fonctions en coordonnées cartésiennes). La solution élémentaire dépend donc de deux paramètres entiers et :
La solution générale de l'équation des ondes (4.12) est donc une combinaison linéaire de ces solutions élémentaires:
où est la racine de . Les coefficients permettent à de vérifier les conditions initiales. A titre d'exemple, on a déterminé et tracé la solution modale:
pour les deux cas particuliers:
La discrétisation de l'équation des ondes (4.11) avec un schéma explicite s'écrit en coordonnées cartésiennes sur un maillage régulier de pas et :
C'est l'extension naturelle du schéma explicite 1D (c3eq15) du chapitre précédent.
Pour discrétiser l'équation en coordonnées polaires (4.15), on discrétise le domaine polaire en avec un pas et , ce qui correspond à des points sur des rayons et des cercles dans le domaine physique (figure 4.10). On note et le nombre de noeuds suivant et
En notant les valeurs aux noeuds, la discrétisation par différences finies explicites de l'équation (4.12) s'écrit:
A cette équation, on ajoute la condition aux limites du problème (4.12) en : . Pour imposer cette condition, on utilise une condition miroir qui permet de calculer la valeur inconnue dans l'équation discrète sur :
A cette condition physique, il faut ajouter des conditions numériques liées à la transformation en coordonnées polaires:
dans les équations pour et .
La seconde condition est nécessaire, car l'équation discrétisée (4.16) dégénère en , de même que l'équation exacte (4.12) à cause des termes en .
Pour lever cette dégénérescence en , on utilise l'équation discrétisée en coordonnées cartésiennes (4.15). Avec les notations de la figure (4.11) et suivant les axes , cette équation s'écrit en :
En effectuant une rotation des axes de 45 degrés, on obtiens une autre équation équivalente:
La valeur de étant unique, on choisit la moyenne de ces équations:
soit, de façon générale si on a noeuds dans la direction :
Cette dernière équation peut s'interpréter comme un bilan de flux sur un disque de rayon . En intégrant l'équation (4.12) sur ce disque, il vient, après utilisation du théorème de Green:
On approxime chacun de ses termes par différences finies. Pour le premier terme, on utilise l'approximation de la dérivée seconde en temps en :
et pour le second l'approximation de la dérivée première en sur chaque rayon d'angle
ce qui fournit l'approximation de la seconde intégrale:
En combinant ces deux approximations, on retrouve l'équation (4.19), qui permet de calculer l'évolution temporelle de la valeur .
La résolution numérique du schéma explicite (4.16) nécessite l'initialisation de la solution à et à . On applique la même démarche que pour l'équation des ondes en 1D (paragraphe c3ondes). Disposant des deux conditions initiales du problème (4.12), la valeur est donnée par la première condition:
et la valeur de est obtenue à partir d'un développement limité en temps à l'ordre 2 autour de :
La valeur de est fournie par la seconde condition initiale, et on utilise l'équation exacte pour calculer en fonction du laplacien de , que l'on discrétise ensuite par différences finies centrées:
On obtiens ainsi la valeur de avec une précision , identique à celle du schéma:
L'étude de la stabilité et de la consistance est effectuée tout d'abord sur l'équation discrétisée en coordonnées cartésiennes (4.15), et nous en déduirons ensuite les propriétés pour l'équation discrétisée en coordonnées polaires (4.16).
L'étude de la stabilité utilise le programme Maple 4.3.3. On remplace (ligne 12) dans l'équation discrétisée définie à la ligne 7, la solution approchée par une perturbation, que l'on a décomposé en mode de Fourier suivant et (ligne 11):
Après simplification, on obtiens une équation du second degré pour le facteur d'amplification (ligne 19):
Le coefficient est simplifié (lignes 21 et 22), et s'exprime en fonction de 2 nombres de Courant et et de et :
Le produit des racines de l'équation (4.22) étant égale à 1, la condition de stabilité impose donc que ces racines soient complexes conjuguées, i.e. que le discriminant soit négatif:
ce qui conduit à la condition (ligne 25 et 26):
La condition de stabilité du schéma explicite (4.15) s'écrit donc:
C'est une condition de Courant:
basé sur une longueur caractéristique de la maille différence finie définie par:
Si les pas de discrétisation sont égaux ( ), on a . La condition de stabilité est donc plus sévère en 2D qu'en 1D.
> restart;with(plots): # Equation des ondes en cartesien > diff(U(x,y,t),t$2)=c0^2*(diff(U(x,y,t),x$2)+ diff(U(x,y,t),y$2)); > eq:=%: # Equation D.F. > (U[i,j,n+1]-2*U[i,j,n]+U[i,j,n-1])/dt^2=c0^2*((U[i+1,j,n]- 2*U[i,j,n]+U[i-1,j,n])/dx^2+(U[i,j+1,n]- 2*U[i,j,n]+U[i,j-1,n])/dy^2); eqh:=%: # Etude de stabilite > Up:=(i,j,n)->Psi[n]*exp(I*omega[1]*i*dx)*exp(I*omega[2]*j*dy); > subs(U[i,j,n+1]=Up(i,j,n+1),U[i,j,n-1]=Up(i,j,n-1), U[i,j,n]=Up(i,j,n),U[i-1,j,n]=Up(i-1,j,n), U[i+1,j,n]=Up(i+1,j,n),U[i,j-1,n]=Up(i,j-1,n), U[i,j+1,n]=Up(i,j+1,n),eqh); # > rel1:=simplify(%*exp(-I*omega[1]*i*dx)*exp(-I*omega[2]*j*dy)): > simplify(subs(Psi[n+1]=G*Psi[n],Psi[n-1]=Psi[n]/G,rel1*G/Psi[n])); > collect(dt^2*(lhs(%)-rhs(%)),G)=0;eq3:=lhs(%): # calcul du coefficient de G > coeff(eq3,G):expand(%); > subs(cos(omega[1]*dx)=1-2*y[1]^2,cos(omega[2]*dy)=1-2*y[2]^2, dx=dt*c0/CFL[1],dy=dt*c0/CFL[2],%):simplify(%);b:=%/2; # Racines G complexes conjuguees si Delta<0 > Delta:=b^2-1;factor(%); > CFL[1]^2*y[1]^2+CFL[2]^2*y[2]^2<1; # Condition de stabilite > CFL[1]^2+CFL[2]^2<1;cdts:=%: > subs(CFL[1]=c0*dt/dx,CFL[2]=c0*dt/dy,cdts); > dt*c0*sqrt(1/dx^2+1/dy^2)<1; # Erreur de troncature > Uex:=(p,q,r)->U(x+(p-i)*dx,y+(q-j)*dy,t+(r-n)*dt); > subs(U[i,j,n]=Uex(i,j,n),U[i,j,n-1]=Uex(i,j,n-1),U[i,j,n+1]= Uex(i,j,n+1),U[i+1,j,n]=Uex(i+1,j,n),U[i-1,j,n]=Uex(i-1,j,n), U[i,j+1,n]=Uex(i,j+1,n),U[i,j-1,n]=Uex(i,j-1,n), lhs(eqh)-rhs(eqh)); rel3:=%: # > U(x,y,t+dt)=convert(mtaylor(U(x,y,t+dt),[dt],8),diff);S1:=%: > U(x,y,t-dt)=convert(mtaylor(U(x,y,t-dt),[dt],8),diff):S2:=%: > U(x+dx,y,t)=convert(mtaylor(U(x+dx,y,t),[dx],8),diff):S3:=%: > U(x-dx,y,t)=convert(mtaylor(U(x-dx,y,t),[dx],8),diff):S4:=%: > U(x,y+dy,t)=convert(mtaylor(U(x,y+dy,t),[dy],8),diff):S5:=%: > U(x,y-dy,t)=convert(mtaylor(U(x,y-dy,t),[dy],8),diff):S6:=%: > subs(S1,S2,S3,S4,S5,S6,rel3-(lhs(eq)-rhs(eq))):simplify(%); # Schema d'ordre 2
Par analogie, la condition de stabilité du schéma explicite (4.16) en coordonnée polaire est aussi la condition de Courant (4.23). Il faut cependant définir la longueur caractéristique de la maille en coordonnée polaire. Cette longueur ne doit pas être basée sur les dimensions et de la maille dans l'espace transformé, mais sur les dimensions de la maille et dans l'espace physique:
La maille dans l'espace physique n'étant pas constante (elle dépend de ), on doit prendre la plus petite valeur de dans le maillage, qui est obtenue pour
ce qui fournit la condition de stabilité du schéma (4.16):
On constate que cette condition en coordonnée polaire est beaucoup plus contraignante que la condition (4.23) en coordonnées cartésiennes. Pour un maillage de points dans chaque direction, il faut choisir un pas en temps tel que en cartésien et en polaire.
Le calcul Maple (lignes 32 à 44 du programme 4.3.3) fournit l'erreur de troncature pour le schéma (4.15) en cartésien:
Le schéma explicite (4.15) est donc d'ordre 2 en temps et en espace (i.e. a une précision en ).
Par analogie, on en déduit que le schéma explicite (4.16) est aussi d'ordre 2 en temps et en espace (i.e. a une précision en ).
Enfin on note que ces schémas explicites (4.15) et (4.16) sont des schémas dispersifs, mais non dissipatifs comme en 1D (puisque le facteur d'amplification à un module égal à 1).
Le programme Matlab (4.3.4) implémente le schéma explicite en cordonnées polaires (4.16). Les paramètres du calcul sont définies sur les lignes 3 à 13, avec un définit par la relation (4.25). Pour tenir compte simplement des conditions de périodicité, la solution approchée est définie comme un tableau de dimension , i.e. avec variant de 0 ( à et de 0 à . La solution initiale est définie sur les lignes 14 à 21 comme combinaison linéaire des 2 modes propres (4.15). Cette solution initiale permet l'initialisation des champs (lignes 24 à 26). La seconde condition initiale (4.21) est appliquée lors de la première itération en temps en notant que cette condition est dans notre cas équivalente à l'équation aux différences (4.16) pour avec , i.e. l'équivalent d'une condition miroir à l'instant initiale. Cette condition peut alors être implémentée en initialisant et avec , et en calculant à la première itération avec la formule générale (4.16), et un coefficient divisé par deux (ligne 37).
Dans les itérations en temps (lignes 34 à 57), on utilise l'équation aux différences (4.16) pour les noeuds internes , en utilisant la programmation matricielle Matlab (ligne 40) . La condition aux limites en fournit la valeur aux noeuds frontières (ligne 45). Les conditions de périodicité fournissent les valeurs aux noeuds frontières et (lignes 49 à 50). Enfin l'équation pour les noeuds en est écrite aux lignes 52 à 54.
% equation des ondes en polaire % schema explicite clear; R1=1; Ntheta=50; Nr=80; dtheta=2*pi/(Ntheta-1);dr=R1/(Nr-1); R=[0:dr:R1]'; Theta=[0:dtheta:2*pi]; % pts du maillage X=R*cos(Theta); Y=R*sin(Theta); % parametre c0=1; CFL=0.9; dt=CFL*dr*dtheta/c0 % cdts initial k1=0; a1=1.0; lambda1=fzero(inline('0*besselj(0,r)-r*besselj(1,r)'),10) BJ1=inline('besselj(0,r)','r'); k2=1; a2=0.5; lambda2=fzero(inline('1*besselj(1,r)-r*besselj(2,r)'),10) BJ2=inline('besselj(1,r)','r'); W=(a1*BJ1(lambda1*R)*cos(k1*Theta)+... a2*BJ2(lambda2*R)*cos(k2*Theta)); % initialisation Un0=zeros(Nr,Ntheta+1); Un0(:,1:Ntheta)=W; Un0(:,Ntheta+1)=Un0(:,2); Un=Un0;Un1=Un; % noeuds internes I=[2:Nr-1];J=[2:Ntheta]; RI=R(I)*ones(1,Ntheta-1); % schema D.F. Tf=2*(2*pi/c0/lambda1); nit=round(Tf/dt) % iteration for it=1:nit coef=c0^2*dt^2; if (it==1) coef=coef/2; end; % noeuds internes Un1(I,J)=2*Un(I,J)-Un0(I,J) + ... (coef/dtheta^2)*(Un(I,J+1)-2*Un(I,J)+Un(I,J-1))./(RI.^2)+ ... (coef/(2*dr))*(Un(I+1,J)-Un(I-1,J))./RI + ... (coef/dr^2)*(Un(I+1,J)-2*Un(I,J)+Un(I-1,J)); % C.L. en r=1 Un1(Nr,J)=2*Un(Nr,J)-Un0(Nr,J) + ... (coef/dtheta^2)*(Un(Nr,J+1)-2*Un(Nr,J)+Un(Nr,J-1))/(R(Nr))+ ... (coef/dr^2)*(Un(Nr-1,J)-2*Un(Nr,J)+Un(Nr-1,J)); % periodicite Un1(1:Nr,1)=Un1(1:Nr,Ntheta); Un1(1:Nr,Ntheta+1)=Un1(1:Nr,2); % C.L. en r=0 Um=sum(Un(2,2:Ntheta))/(Ntheta-1); Um1=2*Un(1,1)-Un0(1,1)+(4*coef/dr^2)*(Um-Un(1,1)); Un1(1,1:Ntheta+1)=Um1; % iteration suivante Un0=Un; Un=Un1; end;
Sur la figure (4.12), on a tracé la solution calculée au bout d'une période, avec , et , pour les deux conditions initiales étudiées analytiquement au paragraphe sol_ondes2d. Elles se comparent parfaitement aux solutions analytiques de la figure (4.9).
Pour tester la stabilité du schéma, nous avons fait varier le pas en temps pour deux maillages donnés: ( , ) et ( , ) avec la condition initiale suivante:
Nous avons ensuite calculé l'erreur en en comparant la solution approchée sur l'axe et la solution exacte ) sur un temps de l'ordre de deux périodes . On a tracé ces évolutions sur la figure (4.13). On constate bien que la solution diverge dès que le nombre de Courant (4.25) est supérieur ou égale à 1. On peut aussi noter que si l'on choisit une condition initiale ne dépendant pas de la solution reste stable pour des beaucoup plus grands (i.e. ), ce qui montre que l'instabilité la plus sévére proviens de la discrétisation du terme en . Théoriquement au bout d'un nombre très grand d'itérations, les erreurs d'arrondis devraient pouvoir déstabiliser la solution, mais ici la symétrie des calculs fait que ces erreurs sont indépendantes de et la solution non perturbée reste stable.
Pour étudier la précision du calcul, nous avons calculer l'erreur au centre pour différents maillages avec un avec la même condition initiale. La solution au centre étant indépendante de , nous avons uniquement fait varier la discrétisation suivant en choisissant des valeurs de de 10 à 640. La taille caractéristique du maillage est , et nous avons tracé l'erreur sur l'axe en fonction de sur la figure (4.14).
On constate sur cette figure que l'erreur se comporte à la limite en , ce qui était prévue par la théorie. Cela montre que notre condition en préserve la précision d'ordre 2 du schéma.