/** #Viscous Collapse: Effondrement visqueux: il s'agit de l'effondrement d'un tas 1D initialement rectangulaire et disposé sur une pente $Z(x)$. Comme l'écoulement est très visqueux, l'inertie est vite négligeable: on a vite un équilibre entre le terme de pente (de gravité) qui fait tomber et le frottement visqueux qui freine. Cet écoulement pourrait modéliser de la lave s'écoulant le long d'un volcan (il est générique en géophysique, le terme à changer est celui du frottement, nous verrons sur les autres pages le cas de bingham, fluide à seuil). Les équations de Saint Venant $$\frac{\partial h} {\partial t} + \frac{\partial (Q)}{\partial x}=0$$ $$\frac{\partial Q } {\partial t} + \frac{\partial }{\partial x}(\Gamma\frac{Q^2}{ h } + \frac{g}{2} (h_{\;}^2))= -gZ' h - Cf \frac{Q}{h_{\;}^2}$$ avec $\Gamma=1$ (au lieu de (5/4)) et $C_f=3\nu$ sont résolues pour la partie non visqueuse dans: */ #include "grid/cartesian1D.h" #include "saint-venant.h" /** On se donne une masse initiale $A=\int_{0}^{x_1} h(x,0) dx$ sur une pente $\alpha$ */ double Cf,h0,alpha,tmax; #define MAXLEVEL 13 #define MINLEVEL 11 /** Initialisation d'un tas de masse 1 */ event init (i = 0) { foreach() { zb[] = -(x-X0)*alpha; h[] = h0*(x>0)*(x<=1./h0); } } u.n[right] = neumann(0); h[right] = neumann(0); event friction (i++) { // Poiseuille friction (implicit scheme) foreach() { double ff = h[] < dry ? HUGE : (1. + Cf*dt/h[]/h[]); u.x[] /= ff;} boundary ({u.x}); } event plot (t=0.000001;t < tmax;t+=50) { FILE * fp = fopen ("sol.dat", "w"); //a=.584;p[][]'sol.dat'u ($1/$3**(1./3)):($2*$3**(1./3)),'sol13.dat' u ($1/$3**(1./3)):($2*$3**(1./3)),a*sqrt(x)*(x<(3./2./a)**(2./3)) fprintf (stderr," %g \n", t); printf ("a=.584;p[:][0:.25] '-' u 1:2 t'calc' w l,''u 1:(a*( sqrt($1/$3))*($1<((9/4/a/a*$3)**(1./3))))t'selfs' w l \n"); for(double x=X0;x v.out echo "set term png;set output 'slope.png';set multiplot; set nokey ; set xrange[-5:25] ; set yrange [:1];" > dmp cat v.out >> dmp mv dmp v.out cat v.out | gnuplot ~~~ ce qui produit la comparaison entre la solution semblable et le calcul: ![collapse](/sandbox/M1EMN/Exemples/Img/slope.png) Les fronts en fonction du temps sortent de `out` ~~~gnuplot heap as a function of time set xlabel "x" set ylabel "h(x,t)" p[][0:.5]'out' u 1:2 t'h(x,t)' w l ~~~ # Comparaison avec la solution analytique autosemblable $F(\eta)$ Pour les pentes fortes telles que $|Z'|\gg \partial_x h$, on peut simplier les équations car on n'a plus que l'équilibre entre la pente et le frottement: alors $Q= -gZ' h^3/(3 \nu)$ et l'équation de la masse devient $$\frac{\partial h} {\partial t} - \frac{gZ'}{3\nu} \frac{\partial }{\partial x} h_{\;}^3 =0,$$ l'équation est de la forme $$ \frac{\partial h} {\partial t} -k h_{\;}^2 \frac{\partial h}{\partial x} =0$$ Huppert en trouve une solution par les caractéristiques, ici, nous nous proposons de trouver la soution sous forme auto semblable. Par changement d'échelle, l'invariance par dilatation donne $H/T=H^3/X$, la masse conservée donne $HX=1$, ce qui permet de trouver $H=T_{\;}^{-1/3}$ et $X=T_{\;}^{1/3}$ donc une solution auto semblable de la forme $t_{\;}^{-1/3}F(x/t_{\;}^{1/3})$ convient, par subsitution $$ -\eta F'(\eta )-F(\eta )+3 k F(\eta )^2 F'(\eta )=0 $$ avec $F(0)=0$ on a la forme implicite $\eta=k (F(\eta)^2)$ et donc la solution est $F(\eta)=\sqrt{(\eta)/k},$ la solution du problème est simplement pour $0