%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Copyright G. Allaire, Novembre 2000 % % schemas numeriques a limiteur de flux (TVD d'ordre 2) % pour l'equation de transport lineaire % avec condition aux limites periodiques % u,t + a u,x = 0 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % lg = longueur du domaine lg = 1. ; % nx = nombre de mailles nx = 100 ; % dx = pas d'espace dx = lg/nx ; % a = vitesse de transport (doit etre positive) a = 1. ; % dt = pas de temps cfl = dx/a; dt = 0.9*cfl ; % nt = nombre de pas de temps pour faire un tour nt = floor(lg/(a*dt)) ; % % initialisation % x=zeros(1,nx) ; % uf = solution de Lax-Friedrichs uf=zeros(1,nx) ; % uw = solution de Lax-Wendroff uw=zeros(1,nx) ; % ua = solution upwind (amont) ua=zeros(1,nx) ; % ue = solution exacte (donnee initiale) ue=zeros(1,nx) ; v=zeros(1,nx) ; up=zeros(1,nx) ; um=zeros(1,nx) ; arg=zeros(1,nx) ; % for i=1:nx x(i) = (i-1)*dx ; ue(i) = 0. ; if abs(x(i)-0.3)<=0.1 ue(i) = 1. ; end end uf = ue ; uw = ue ; ua = ue ; % affichage de la donnee initiale plot(x,ue) ; axis([0 lg -0.2 1.2]) ; title('Lax-Friedrichs, Lax-Wendroff, upwind, cfl=0.9') pause(1) ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % marche en temps : Lax-Friedrichs, Lax-Wendroff, upwind % cfl=0.9 comparaison sur des temps petits %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % w est la solution exacte % si u est le vecteur des valeurs u(i) alors % up est le vecteur des u(i+1) % um est le vecteur des u(i-1) % for n=1:3*nt % % Lax-Friedrichs up = wshift2('1D',uf,+1) ; um = wshift2('1D',uf,-1) ; v = (up+um)/2 - (0.5*dt/dx)*a*(up-um) ; uf = v ; % Lax-Wendroff up = wshift2('1D',uw,+1) ; um = wshift2('1D',uw,-1) ; v = uw - (0.5*dt/dx)*a*(up-um) + ... (0.5*dt*dt/(dx*dx))*( a*a*(up-uw) - a*a*(uw-um) ) ; uw = v ; % upwind um = wshift2('1D',ua,-1) ; v = ua - (dt/dx)*a*(ua-um) ; ua = v ; % affichage de la solution approchee et exacte if mod(n,5) == 0 % for i=1:nx ue(i) = 0. ; arg(i) = mod(x(i)-n*a*dt,lg) ; if abs(arg(i)-0.3)<=0.1 ue(i) = 1. ; end end plot(x,ue,x,uf,':',x,uw,'d',x,ua,'o') ; axis([0 lg -0.2 1.2]) ; title('Lax-Friedrichs, Lax-Wendroff, upwind, cfl=0.9') legend('exact','Lax-Friedrichs','Lax-Wendroff','upwind') ; pause(0) ; end % end pause ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Lax-Friedrichs, Lax-Wendroff, upwind % cas tres particulier cfl=0.999 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % dt = pas de temps dt = 0.999*cfl ; % nt = nombre de pas de temps pour faire un tour nt = floor(lg/(a*dt)) ; % % initialisation % x=zeros(1,nx) ; % uf = solution de Lax-Friedrichs uf=zeros(1,nx) ; % uw = solution de Lax-Wendroff uw=zeros(1,nx) ; % ua = solution upwind (amont) ua=zeros(1,nx) ; % ue = solution exacte (donnee initiale) ue=zeros(1,nx) ; v=zeros(1,nx) ; up=zeros(1,nx) ; um=zeros(1,nx) ; arg=zeros(1,nx) ; % for i=1:nx x(i) = (i-1)*dx ; ue(i) = 0. ; if abs(x(i)-0.3)<=0.1 ue(i) = 1. ; end end uf = ue ; uw = ue ; ua = ue ; % affichage de la donnee initiale plot(x,ue) ; axis([0 lg -0.2 1.2]) ; title('Lax-Friedrichs, Lax-Wendroff, upwind, cfl=0.999') pause(0) ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % marche en temps : Lax-Friedrichs, Lax-Wendroff, upwind %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % w est la solution exacte % si u est le vecteur des valeurs u(i) alors % up est le vecteur des u(i+1) % um est le vecteur des u(i-1) % for n=1:3*nt % % Lax-Friedrichs up = wshift2('1D',uf,+1) ; um = wshift2('1D',uf,-1) ; v = (up+um)/2 - (0.5*dt/dx)*a*(up-um) ; uf = v ; % Lax-Wendroff up = wshift2('1D',uw,+1) ; um = wshift2('1D',uw,-1) ; v = uw - (0.5*dt/dx)*a*(up-um) + ... (0.5*dt*dt/(dx*dx))*( a*a*(up-uw) - a*a*(uw-um) ) ; uw = v ; % upwind um = wshift2('1D',ua,-1) ; v = ua - (dt/dx)*a*(ua-um) ; ua = v ; % affichage de la solution approchee et exacte if mod(n,5) == 0 % for i=1:nx ue(i) = 0. ; arg(i) = mod(x(i)-n*a*dt,lg) ; if abs(arg(i)-0.3)<=0.1 ue(i) = 1. ; end end plot(x,ue,x,uf,':',x,uw,'d',x,ua,'o') ; axis([0 lg -0.2 1.2]) ; title('Lax-Friedrichs, Lax-Wendroff, upwind, cfl=0.999') legend('exact','Lax-Friedrichs','Lax-Wendroff','upwind') ; pause(0) ; end % end pause ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Lax-Friedrichs, Lax-Wendroff, upwind % cfl=0.999 comparaison sur 50 tours %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % dt = pas de temps dt = 0.999*cfl ; % nt = nombre de pas de temps pour faire un tour nt = floor(lg/(a*dt)) ; % % initialisation % x=zeros(1,nx) ; % uf = solution de Lax-Friedrichs uf=zeros(1,nx) ; % uw = solution de Lax-Wendroff uw=zeros(1,nx) ; % ua = solution upwind (amont) ua=zeros(1,nx) ; % ue = solution exacte (donnee initiale) ue=zeros(1,nx) ; v=zeros(1,nx) ; up=zeros(1,nx) ; um=zeros(1,nx) ; arg=zeros(1,nx) ; % for i=1:nx x(i) = (i-1)*dx ; ue(i) = 0. ; if abs(x(i)-0.3)<=0.1 ue(i) = 1. ; end end uf = ue ; uw = ue ; ua = ue ; % affichage de la donnee initiale plot(x,ue) ; axis([0 lg -0.2 1.2]) ; title('Lax-Friedrichs, Lax-Wendroff, upwind, cfl=0.999') pause(0) ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % marche en temps : Lax-Friedrichs, Lax-Wendroff, upwind %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % w est la solution exacte % si u est le vecteur des valeurs u(i) alors % up est le vecteur des u(i+1) % um est le vecteur des u(i-1) % for n=1:50*nt % % Lax-Friedrichs up = wshift2('1D',uf,+1) ; um = wshift2('1D',uf,-1) ; v = (up+um)/2 - (0.5*dt/dx)*a*(up-um) ; uf = v ; % Lax-Wendroff up = wshift2('1D',uw,+1) ; um = wshift2('1D',uw,-1) ; v = uw - (0.5*dt/dx)*a*(up-um) + ... (0.5*dt*dt/(dx*dx))*( a*a*(up-uw) - a*a*(uw-um) ) ; uw = v ; % upwind um = wshift2('1D',ua,-1) ; v = ua - (dt/dx)*a*(ua-um) ; ua = v ; % affichage de la solution approchee et exacte if mod(n,2*nt) == 0 % for i=1:nx ue(i) = 0. ; arg(i) = mod(x(i)-n*a*dt,lg) ; if abs(arg(i)-0.3)<=0.1 ue(i) = 1. ; end end plot(x,ue,x,uf,':',x,uw,'d',x,ua,'o') ; axis([0 lg -0.2 1.2]) ; in = floor(n/nt) ; title('50 tours, cfl=0.999') legend('exact','Lax-Friedrichs','Lax-Wendroff','upwind') ; pause(0) ; end % end pause ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % schemas TVD % cfl=0.9 comparaison sur 50 tours %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % dt = pas de temps dt = 0.5*cfl ; % nt = nombre de pas de temps pour faire un tour nt = floor(lg/(a*dt)) ; % % initialisation % x=zeros(1,nx) ; % phi = limiteur phi=zeros(1,nx) ; phim=zeros(1,nx) ; % du = increment u(i+1)-u(i) du=zeros(1,nx) ; % ua = solution upwind (amont) ua=zeros(1,nx) ; % ur = solution TVD minmod ur=zeros(1,nx) ; % us = solution TVD superbee us=zeros(1,nx) ; % ub = solution TVD ultrabee ub=zeros(1,nx) ; % uk = solution ordre 2 espace, ordre 1 temps uk=zeros(1,nx) ; % ue = solution exacte (donnee initiale) ue=zeros(1,nx) ; v=zeros(1,nx) ; up=zeros(1,nx) ; um=zeros(1,nx) ; f=zeros(1,nx) ; fm=zeros(1,nx) ; mi=zeros(1,nx) ; ma=zeros(1,nx) ; arg=zeros(1,nx) ; % for i=1:nx x(i) = (i-1)*dx ; ue(i) = 0. ; if abs(x(i)-0.3)<=0.1 ue(i) = 1. ; end end ua = ue ; ur = ue ; us = ue ; ub = ue ; uk = ue ; % affichage de la donnee initiale plot(x,ue) ; axis([0 lg -0.2 1.2]) ; title('schemas TVD, cfl=0.9') pause(0) ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % marche en temps : TVD %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % w est la solution exacte % si u est le vecteur des valeurs u(i) alors % up est le vecteur des u(i+1) % um est le vecteur des u(i-1) % for n=1:50*nt % % upwind um = wshift2('1D',ua,-1) ; v = ua - (dt/dx)*a*(ua-um) ; ua = v ; % minod um = wshift2('1D',ur,-1) ; up = wshift2('1D',ur,+1) ; du = ur-um ; du = du + 1.e-6*(1+sign(du)).*(1-sign(du)) ; dum = wshift2('1D',du,-1) ; phi = dum./du ; phi = max(0.,min(1.,phi)) ; phim = wshift2('1D',phi,-1) ; v = ur - (dt/dx)*a*(ur-um) + 0.5*(dt/dx)*a*... ((dt/dx)*a-1.)*(phi.*(up-ur)-phim.*(ur-um)) ; ur = v ; % superbee um = wshift2('1D',us,-1) ; up = wshift2('1D',us,+1) ; du = us-um ; du = du + 1.e-6*(1+sign(du)).*(1-sign(du)) ; dum = wshift2('1D',du,-1) ; phi = dum./du ; phi = max(min(2*phi,1.),min(2.,phi)) ; phi = max(phi,0.) ; phim = wshift2('1D',phi,-1) ; v = us - (dt/dx)*a*(us-um) + 0.5*(dt/dx)*a*... ((dt/dx)*a-1.)*(phi.*(up-us)-phim.*(us-um)) ; us = v ; % ultrabee a la Despres-Lagoutiere um = wshift2('1D',ub,-1) ; up = wshift2('1D',ub,+1) ; mi = min(ub,um) ; ma = max(ub,um) ; for i=1:nx binf = ma(i) + (ub(i)-ma(i))/((dt/dx)*a) ; bsup = mi(i) + (ub(i)-mi(i))/((dt/dx)*a) ; if up(i) <= binf f(i) = binf ; elseif up(i) >= bsup f(i) = bsup ; else f(i) = up(i) ; end end fm = wshift2('1D',f,-1) ; v = ub - (dt/dx)*a*(f-fm) ; ub = v ; % ordre 2 en x et 1 en t um = wshift2('1D',uk,-1) ; up = wshift2('1D',uk,+1) ; du = up-uk ; dum = wshift2('1D',du,-1) ; phi = sign(du).*max(0.,min(abs(du),sign(du).*dum)) ; f = uk + 0.5*phi ; fm = wshift2('1D',f,-1) ; v = uk - (dt/dx)*a*(f-fm) ; uk = v ; % affichage de la solution approchee et exacte if mod(n,nt) == 0 % for i=1:nx ue(i) = 0. ; arg(i) = mod(x(i)-n*a*dt,lg) ; if abs(arg(i)-0.3)<=0.1 ue(i) = 1. ; end end plot(x,ue,x,ua,':',x,ur,'d',x,us,'o',x,ub,'<',x,uk,'p') ; axis([0 lg -0.2 1.2]) ; in = floor(n/nt) ; title('creneau TVD 50 tours, cfl=0.9') legend('exact','upwind','minmod','superbee','ultrabee DL','ordre 2-1') ; pause(0) ; end % end pause ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % schemas TVD donnee reguliere % cfl=0.9 comparaison sur 200 tours %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % dt = pas de temps dt = 0.9*cfl ; % nt = nombre de pas de temps pour faire un tour nt = floor(lg/(a*dt)) ; % % initialisation % x=zeros(1,nx) ; % phi = limiteur phi=zeros(1,nx) ; phim=zeros(1,nx) ; % du = increment u(i+1)-u(i) du=zeros(1,nx) ; % ua = solution upwind (amont) ua=zeros(1,nx) ; % ur = solution TVD minmod ur=zeros(1,nx) ; % us = solution TVD superbee us=zeros(1,nx) ; % ub = solution TVD ultrabee ub=zeros(1,nx) ; % ue = solution exacte (donnee initiale) ue=zeros(1,nx) ; v=zeros(1,nx) ; up=zeros(1,nx) ; um=zeros(1,nx) ; f=zeros(1,nx) ; fm=zeros(1,nx) ; mi=zeros(1,nx) ; ma=zeros(1,nx) ; arg=zeros(1,nx) ; % for i=1:nx x(i) = (i-1)*dx ; ue(i)= sin(x(i)*2*pi) ; end ua = ue ; ur = ue ; us = ue ; ub = ue ; % affichage de la donnee initiale plot(x,ue) ; axis([0 lg -1.2 1.2]) ; title('schemas TVD, cfl=0.9') pause(0) ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % marche en temps : TVD %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % w est la solution exacte % si u est le vecteur des valeurs u(i) alors % up est le vecteur des u(i+1) % um est le vecteur des u(i-1) % for n=1:200*nt % % upwind um = wshift2('1D',ua,-1) ; v = ua - (dt/dx)*a*(ua-um) ; ua = v ; % minod um = wshift2('1D',ur,-1) ; up = wshift2('1D',ur,+1) ; du = ur-um ; du = du + 1.e-6*(1+sign(du)).*(1-sign(du)) ; dum = wshift2('1D',du,-1) ; phi = dum./du ; phi = max(0.,min(1.,phi)) ; phim = wshift2('1D',phi,-1) ; v = ur - (dt/dx)*a*(ur-um) + 0.5*(dt/dx)*a*... ((dt/dx)*a-1.)*(phi.*(up-ur)-phim.*(ur-um)) ; ur = v ; % superbee um = wshift2('1D',us,-1) ; up = wshift2('1D',us,+1) ; du = us-um ; du = du + 1.e-6*(1+sign(du)).*(1-sign(du)) ; dum = wshift2('1D',du,-1) ; phi = dum./du ; phi = max(min(2*phi,1.),min(2.,phi)) ; phi = max(phi,0.) ; phim = wshift2('1D',phi,-1) ; v = us - (dt/dx)*a*(us-um) + 0.5*(dt/dx)*a*... ((dt/dx)*a-1.)*(phi.*(up-us)-phim.*(us-um)) ; us = v ; % ultrabee a la Despres-Lagoutiere um = wshift2('1D',ub,-1) ; up = wshift2('1D',ub,+1) ; mi = min(ub,um) ; ma = max(ub,um) ; for i=1:nx binf = ma(i) + (ub(i)-ma(i))/((dt/dx)*a) ; bsup = mi(i) + (ub(i)-mi(i))/((dt/dx)*a) ; if up(i) <= binf f(i) = binf ; elseif up(i) >= bsup f(i) = bsup ; else f(i) = up(i) ; end end fm = wshift2('1D',f,-1) ; v = ub - (dt/dx)*a*(f-fm) ; ub = v ; % affichage de la solution approchee et exacte if mod(n,4*nt) == 0 % for i=1:nx ue(i) = 0. ; arg(i) = mod(x(i)-n*a*dt,lg) ; ue(i) = sin(arg(i)*2*pi) ; end plot(x,ue,x,ua,':',x,ur,'d',x,us,'o',x,ub,'<') ; axis([0 lg -1.2 1.2]) ; in = floor(n/nt) ; title('sinus TVD 200 tours, cfl=0.9') legend('exact','upwind','minmod','superbee','ultrabee DL') ; pause(0) ; end % end pause ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % schemas TVD donnee initiale reguliere % cfl=0.66 comparaison sur 20 tours %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % dt = pas de temps dt = 0.66*cfl ; % nt = nombre de pas de temps pour faire un tour nt = floor(lg/(a*dt)) ; % % initialisation % x=zeros(1,nx) ; % phi = limiteur phi=zeros(1,nx) ; phim=zeros(1,nx) ; % du = increment u(i+1)-u(i) du=zeros(1,nx) ; % ua = solution upwind (amont) ua=zeros(1,nx) ; % ur = solution TVD minmod ur=zeros(1,nx) ; % us = solution TVD superbee us=zeros(1,nx) ; % ub = solution TVD ultrabee ub=zeros(1,nx) ; % uk = solution ordre 2 espace, ordre 1 temps uk=zeros(1,nx) ; % ue = solution exacte (donnee initiale) ue=zeros(1,nx) ; v=zeros(1,nx) ; up=zeros(1,nx) ; um=zeros(1,nx) ; f=zeros(1,nx) ; fm=zeros(1,nx) ; mi=zeros(1,nx) ; ma=zeros(1,nx) ; arg=zeros(1,nx) ; % for i=1:nx x(i) = (i-1)*dx ; ue(i) = 0.5*(1.+sin(2*pi*x(i))) ; % ue(i) = exp(-30.*(0.5-x(i))^2) ; end ua = ue ; ur = ue ; us = ue ; ub = ue ; uk = ue ; % affichage de la donnee initiale plot(x,ue) ; axis([0 lg -0.2 1.2]) ; title('schemas TVD, cfl=0.66') pause(0) ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % marche en temps : TVD %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % w est la solution exacte % si u est le vecteur des valeurs u(i) alors % up est le vecteur des u(i+1) % um est le vecteur des u(i-1) % for n=1:20*nt % % upwind um = wshift2('1D',ua,-1) ; v = ua - (dt/dx)*a*(ua-um) ; ua = v ; % minod um = wshift2('1D',ur,-1) ; up = wshift2('1D',ur,+1) ; du = ur-um ; du = du + 1.e-6*(1+sign(du)).*(1-sign(du)) ; dum = wshift2('1D',du,-1) ; phi = dum./du ; phi = max(0.,min(1.,phi)) ; phim = wshift2('1D',phi,-1) ; v = ur - (dt/dx)*a*(ur-um) + 0.5*(dt/dx)*a*... ((dt/dx)*a-1.)*(phi.*(up-ur)-phim.*(ur-um)) ; ur = v ; % superbee um = wshift2('1D',us,-1) ; up = wshift2('1D',us,+1) ; du = us-um ; du = du + 1.e-6*(1+sign(du)).*(1-sign(du)) ; dum = wshift2('1D',du,-1) ; phi = dum./du ; phi = max(min(2*phi,1.),min(2.,phi)) ; phi = max(phi,0.) ; phim = wshift2('1D',phi,-1) ; v = us - (dt/dx)*a*(us-um) + 0.5*(dt/dx)*a*... ((dt/dx)*a-1.)*(phi.*(up-us)-phim.*(us-um)) ; us = v ; % ultrabee a la Despres-Lagoutiere um = wshift2('1D',ub,-1) ; up = wshift2('1D',ub,+1) ; mi = min(ub,um) ; ma = max(ub,um) ; for i=1:nx binf = ma(i) + (ub(i)-ma(i))/((dt/dx)*a) ; bsup = mi(i) + (ub(i)-mi(i))/((dt/dx)*a) ; if up(i) <= binf f(i) = binf ; elseif up(i) >= bsup f(i) = bsup ; else f(i) = up(i) ; end end fm = wshift2('1D',f,-1) ; v = ub - (dt/dx)*a*(f-fm) ; ub = v ; % ordre 2 en x et 1 en t um = wshift2('1D',uk,-1) ; up = wshift2('1D',uk,+1) ; du = up-uk ; dum = wshift2('1D',du,-1) ; phi = sign(du).*max(0.,min(abs(du),sign(du).*dum)) ; f = uk + 0.5*phi ; fm = wshift2('1D',f,-1) ; v = uk - (dt/dx)*a*(f-fm) ; uk = v ; % affichage de la solution approchee et exacte if mod(n,20) == 0 % plot(x,ua,':',x,ur,'d',x,us,'o',x,ub,'<',x,uk,'p') ; axis([0 lg -0.2 1.2]) ; in = floor(n/nt) ; title('creneau TVD 50 tours, cfl=0.66') legend('upwind','minmod','superbee','ultrabee DL','ordre 2x-1t') ; pause(0) ; end % end pause ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % schemas TVD donnee initiale reguliere % cfl=0.5 comparaison sur 20 tours %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % dt = pas de temps dt = 0.5*cfl ; % nt = nombre de pas de temps pour faire un tour nt = floor(lg/(a*dt)) ; % % initialisation % x=zeros(1,nx) ; % phi = limiteur phi=zeros(1,nx) ; phim=zeros(1,nx) ; % du = increment u(i+1)-u(i) du=zeros(1,nx) ; % ua = solution upwind (amont) ua=zeros(1,nx) ; % ur = solution TVD minmod ur=zeros(1,nx) ; % us = solution TVD superbee us=zeros(1,nx) ; % ub = solution TVD ultrabee ub=zeros(1,nx) ; % uk = solution ordre 2 espace, ordre 1 temps uk=zeros(1,nx) ; % ue = solution exacte (donnee initiale) ue=zeros(1,nx) ; v=zeros(1,nx) ; up=zeros(1,nx) ; um=zeros(1,nx) ; f=zeros(1,nx) ; fm=zeros(1,nx) ; mi=zeros(1,nx) ; ma=zeros(1,nx) ; arg=zeros(1,nx) ; % for i=1:nx x(i) = (i-1)*dx ; ue(i) = 0.5*(1.+sin(2*pi*x(i))) ; % ue(i) = exp(-30.*(0.5-x(i))^2) ; end ua = ue ; ur = ue ; us = ue ; ub = ue ; uk = ue ; % affichage de la donnee initiale plot(x,ue) ; axis([0 lg -0.2 1.2]) ; title('schemas TVD, cfl=0.66') pause(0) ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % marche en temps : TVD %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % w est la solution exacte % si u est le vecteur des valeurs u(i) alors % up est le vecteur des u(i+1) % um est le vecteur des u(i-1) % for n=1:50*nt % % upwind um = wshift2('1D',ua,-1) ; v = ua - (dt/dx)*a*(ua-um) ; ua = v ; % minod um = wshift2('1D',ur,-1) ; up = wshift2('1D',ur,+1) ; du = ur-um ; du = du + 1.e-6*(1+sign(du)).*(1-sign(du)) ; dum = wshift2('1D',du,-1) ; phi = dum./du ; phi = max(0.,min(1.,phi)) ; phim = wshift2('1D',phi,-1) ; v = ur - (dt/dx)*a*(ur-um) + 0.5*(dt/dx)*a*... ((dt/dx)*a-1.)*(phi.*(up-ur)-phim.*(ur-um)) ; ur = v ; % superbee um = wshift2('1D',us,-1) ; up = wshift2('1D',us,+1) ; du = us-um ; du = du + 1.e-6*(1+sign(du)).*(1-sign(du)) ; dum = wshift2('1D',du,-1) ; phi = dum./du ; phi = max(min(2*phi,1.),min(2.,phi)) ; phi = max(phi,0.) ; phim = wshift2('1D',phi,-1) ; v = us - (dt/dx)*a*(us-um) + 0.5*(dt/dx)*a*... ((dt/dx)*a-1.)*(phi.*(up-us)-phim.*(us-um)) ; us = v ; % ultrabee a la Despres-Lagoutiere um = wshift2('1D',ub,-1) ; up = wshift2('1D',ub,+1) ; mi = min(ub,um) ; ma = max(ub,um) ; for i=1:nx binf = ma(i) + (ub(i)-ma(i))/((dt/dx)*a) ; bsup = mi(i) + (ub(i)-mi(i))/((dt/dx)*a) ; if up(i) <= binf f(i) = binf ; elseif up(i) >= bsup f(i) = bsup ; else f(i) = up(i) ; end end fm = wshift2('1D',f,-1) ; v = ub - (dt/dx)*a*(f-fm) ; ub = v ; % ordre 2 en x et 1 en t um = wshift2('1D',uk,-1) ; up = wshift2('1D',uk,+1) ; du = up-uk ; dum = wshift2('1D',du,-1) ; phi = sign(du).*max(0.,min(abs(du),sign(du).*dum)) ; f = uk + 0.5*phi ; fm = wshift2('1D',f,-1) ; v = uk - (dt/dx)*a*(f-fm) ; uk = v ; % affichage de la solution approchee et exacte if mod(n,20) == 0 % plot(x,ua,':',x,ur,'d',x,us,'o',x,ub,'<',x,uk,'p') ; axis([0 lg -0.2 1.2]) ; in = floor(n/nt) ; title('creneau TVD 50 tours, cfl=0.5') legend('upwind','minmod','superbee','ultrabee DL','ordre 2x-1t') ; pause(0) ; end % end