init
This commit is contained in:
commit
b7661507e8
13
TP1/Affichage/SetClear.m
Executable file
13
TP1/Affichage/SetClear.m
Executable file
|
@ -0,0 +1,13 @@
|
|||
global PosWait;
|
||||
global SizeWait;
|
||||
global WaitBar;
|
||||
|
||||
present = isempty(PosWait)*isempty(SizeWait)*isempty(WaitBar);
|
||||
if (present==0)
|
||||
clear Hfig KcFrame WaitFrame black fig fy4 lightgreen orange red whitepaper
|
||||
clear KcBar PosKc SizeKc WaitLabel blue fx4 lightblue magenta pink white
|
||||
close(10)
|
||||
end
|
||||
|
||||
PosWait = ''; SizeWait = ''; WaitBar = '';
|
||||
clear PosWait SizeWait WaitBar present
|
64
TP1/Affichage/SetCtrl.m
Executable file
64
TP1/Affichage/SetCtrl.m
Executable file
|
@ -0,0 +1,64 @@
|
|||
global PosWait;
|
||||
global SizeWait;
|
||||
global WaitBar;
|
||||
global PosKc;
|
||||
global SizeKc;
|
||||
global KcBar;
|
||||
|
||||
fig = 10;
|
||||
figure(fig), clf
|
||||
Hfig = gcf;
|
||||
set( Hfig, 'Position', [1000, 600, 380, 100], 'Resize', 'off' );
|
||||
|
||||
% Define some default colors :
|
||||
orange = [0.8 0.7 0.1];
|
||||
magenta = [1.0 0.0 1.0];
|
||||
pink = [0.8 0.5 0.7];
|
||||
blue = [0.2 0.2 1.0];
|
||||
lightblue = [0.5 0.7 0.8];
|
||||
lightgreen = [0.2 0.8 0.3];
|
||||
white = [1.0 1.0 1.0];
|
||||
red = [1.0 0.0 0.0];
|
||||
whitepaper = [0.9 0.9 0.6];
|
||||
black = [0.0 0.0 0.0];
|
||||
|
||||
fx4 = 35; fy4 = 35;
|
||||
|
||||
WaitLabel = uicontrol( Hfig, ...
|
||||
'Style', 'text', ...
|
||||
'Position', [fx4+15 fy4+20 280 15], ...
|
||||
'BackgroundColor', lightblue, ...
|
||||
'ForegroundColor', blue, ...
|
||||
'Visible', 'on', ...
|
||||
'FontSize', [10], ...
|
||||
'FontWeight', 'normal', ...
|
||||
'HorizontalAlignment', 'center', ...
|
||||
'String', 'Wait please ...' );
|
||||
|
||||
WaitFrame = uicontrol( Hfig, ...
|
||||
'Style', 'frame', ...
|
||||
'Position', [fx4+15 fy4+5 280 15], ...
|
||||
'Visible', 'on', ...
|
||||
'BackgroundColor', white );
|
||||
PosWait = [fx4+16 fy4+6 1 13];
|
||||
SizeWait = 278;
|
||||
WaitBar = uicontrol( Hfig, ...
|
||||
'Style', 'frame', ...
|
||||
'Position', PosWait, ...
|
||||
'Visible', 'off', ...
|
||||
'ForegroundColor', red, ...
|
||||
'BackgroundColor', red );
|
||||
|
||||
KcFrame = uicontrol( Hfig, ...
|
||||
'Style', 'frame', ...
|
||||
'Position', [fx4+15 fy4-10 280 15], ...
|
||||
'Visible', 'on', ...
|
||||
'BackgroundColor', white );
|
||||
PosKc = [fx4+16 fy4-9 1 13];
|
||||
SizeKc = 278;
|
||||
KcBar = uicontrol( Hfig, ...
|
||||
'Style', 'frame', ...
|
||||
'Position', PosKc, ...
|
||||
'Visible', 'off', ...
|
||||
'ForegroundColor', blue, ...
|
||||
'BackgroundColor', blue );
|
28
TP1/Affichage/SetWait.m
Executable file
28
TP1/Affichage/SetWait.m
Executable file
|
@ -0,0 +1,28 @@
|
|||
function [] = SetWait( jvp, n, Kc, KcExp )
|
||||
|
||||
global PosWait;
|
||||
global SizeWait;
|
||||
global WaitBar;
|
||||
global PosKc;
|
||||
global SizeKc;
|
||||
global KcBar;
|
||||
|
||||
|
||||
present = isempty(PosWait)*isempty(SizeWait)*isempty(WaitBar);
|
||||
if (present~=0)
|
||||
return
|
||||
end
|
||||
|
||||
PosWait(3) = max( fix( (jvp/n)*SizeWait ), 1 );
|
||||
set( WaitBar, 'Position', PosWait, 'Visible', 'on' ); drawnow;
|
||||
|
||||
if (nargin > 2)
|
||||
present = isempty(PosKc)*isempty(SizeKc)*isempty(KcBar);
|
||||
if (present~=0)
|
||||
return
|
||||
end
|
||||
|
||||
PosKc(3) = max( fix( (Kc/KcExp)*SizeKc ), 1 );
|
||||
set( KcBar, 'Position', PosKc, 'Visible', 'on' ); drawnow;
|
||||
|
||||
end
|
59
TP1/Affichage/plot_uh.m
Executable file
59
TP1/Affichage/plot_uh.m
Executable file
|
@ -0,0 +1,59 @@
|
|||
function nbfig_out=plot_uh(uh,dx1,dx2,N1,N2,nbfig)
|
||||
%
|
||||
% Cette fonction affiche la solution de l'EDP
|
||||
%
|
||||
% Inputs
|
||||
% ------
|
||||
%
|
||||
% uh : solution numérique de l'EDP.
|
||||
%
|
||||
% dx1 : pas d'espace dans la direction x1.
|
||||
%
|
||||
% dx2 : pas d'espace dans la direction x2.
|
||||
%
|
||||
% N1 : nombre de points de grille dans la direction x1.
|
||||
%
|
||||
% N2 : nombre de points de grilles dans la direction x2.
|
||||
%
|
||||
% nbfig : identifiant de la figure
|
||||
%
|
||||
% Outputs:
|
||||
% -------
|
||||
%
|
||||
% nbfig_out : identifiant de la figure
|
||||
%
|
||||
|
||||
|
||||
% Construction de la grille pour l'affichage.
|
||||
x1min=0.;
|
||||
x1max=dx1*(N1+1);
|
||||
x2min=0.;
|
||||
x2max=dx2*(N2+1);
|
||||
if(x1max==0)
|
||||
disp('Erreur : L1=0')
|
||||
return
|
||||
else
|
||||
rxy=x2max/x1max;
|
||||
end
|
||||
|
||||
x1=x1min:dx1:x1max;
|
||||
x2=x2min:dx2:x2max;
|
||||
[X,Y]=meshgrid(x1,x2);
|
||||
[m,n]=size(X);
|
||||
|
||||
% Mise au format 2D de la solution.
|
||||
Z=zeros(N2+2,N1+2);
|
||||
Z(2:N2+1,2:N1+1)=reshape(uh,N2,N1);
|
||||
|
||||
% Affichage
|
||||
nbfig_out=nbfig;
|
||||
figure(nbfig_out)
|
||||
s=surf(X,Y,Z,'FaceAlpha',0.5);
|
||||
s.EdgeColor='none';
|
||||
pbaspect([1 rxy 1]);
|
||||
colorbar;
|
||||
xlabel('x_1')
|
||||
ylabel('x_2')
|
||||
zlabel('u')
|
||||
|
||||
end
|
45
TP1/diffusivity.m
Executable file
45
TP1/diffusivity.m
Executable file
|
@ -0,0 +1,45 @@
|
|||
function [uhref]=diffusivity(nu,L1,L2,N1,N2)
|
||||
%
|
||||
% Cette fonction résoud le problème du calcul d'une solution du Laplacien anisotrope.
|
||||
%
|
||||
% Inputs
|
||||
% ------
|
||||
%
|
||||
% nu: [nu1;nu2] valeurs des paramètres de diffusivité.
|
||||
%
|
||||
% L1 : longeur du domaine dans la direction x1.
|
||||
%
|
||||
% L2 : longueur du domaine dans la direction x2.
|
||||
%
|
||||
% N1 : nombre de points de grille dans la direction x1.
|
||||
%
|
||||
% N2 : nombre de points de grille dans la direction x2.
|
||||
%
|
||||
%
|
||||
% Outputs:
|
||||
% -------
|
||||
%
|
||||
% uhref : vecteur de taille N1*N2 contenant une approximation de la solution
|
||||
%
|
||||
% Ajout du repertoire Affichage à l'environnement
|
||||
addpath('Affichage');
|
||||
|
||||
% Construction de la grille
|
||||
dx1 = L1/(N1+1);
|
||||
dx2 = L2/(N2+1);
|
||||
|
||||
% Calcul de la solution
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
||||
|
||||
% Calcul de la matrice du systeme
|
||||
L = laplacian(nu,dx1,dx2,N1,N2);
|
||||
|
||||
% Calcul de l'approximation de la solution de l'EDP
|
||||
b = forcing(nu, dx1, dx2, N1, N2);
|
||||
uhref = L\b;
|
||||
|
||||
%Affichage de la solution approximee
|
||||
fig_ref = plot_uh(uhref, dx1, dx2, N1, N2, 2); drawnow;
|
||||
|
||||
end
|
27
TP1/forcing.m
Executable file
27
TP1/forcing.m
Executable file
|
@ -0,0 +1,27 @@
|
|||
function b=forcing(nu, dx1, dx2, N1, N2)
|
||||
%
|
||||
% Cette fonction construit le vecteur de forçage de l'EDP
|
||||
%
|
||||
% Inputs
|
||||
% ------
|
||||
%
|
||||
% nu : nu=[nu1;nu2], coefficients de diffusivité dans les directions x1 et x2.
|
||||
%
|
||||
% dx1 : pas d'espace dans la direction x1.
|
||||
%
|
||||
% dx2 : pas d'espace dans la direction x2.
|
||||
%
|
||||
% N1 : nombre de points de grille dans la direction x1.
|
||||
%
|
||||
% N2 : nombre de points de grilles dans la direction x2.
|
||||
%
|
||||
% Outputs:
|
||||
% -------
|
||||
%
|
||||
% b : vecteur de forçage (dimension N1N2)
|
||||
%
|
||||
%
|
||||
|
||||
b = -ones(N1*N2, 1);
|
||||
|
||||
end
|
39
TP1/laplacian.m
Executable file
39
TP1/laplacian.m
Executable file
|
@ -0,0 +1,39 @@
|
|||
function L = laplacian(nu,dx1,dx2,N1,N2)
|
||||
%
|
||||
% Cette fonction construit la matrice de l'opérateur Laplacien 2D anisotrope
|
||||
%
|
||||
% Inputs
|
||||
% ------
|
||||
%
|
||||
% nu : nu=[nu1;nu2], coefficients de diffusivité dans les dierctions x1 et x2.
|
||||
%
|
||||
% dx1 : pas d'espace dans la direction x1.
|
||||
%
|
||||
% dx2 : pas d'espace dans la direction x2.
|
||||
%
|
||||
% N1 : nombre de points de grille dans la direction x1.
|
||||
%
|
||||
% N2 : nombre de points de grilles dans la direction x2.
|
||||
%
|
||||
% Outputs:
|
||||
% -------
|
||||
%
|
||||
% L : Matrice de l'opérateur Laplacien (dimension N1N2 x N1N2)
|
||||
%
|
||||
%
|
||||
|
||||
g1 = -nu(1)/dx1^2;
|
||||
g2 = -nu(2)/dx2^2;
|
||||
a = -2*(g1+g2);
|
||||
|
||||
e = ones(N1*N2, 1);
|
||||
|
||||
e_inf = e;
|
||||
e_inf([N1:N1:N1*N2-1]) = 0;
|
||||
|
||||
e_sup = e;
|
||||
e_sup([N1+1:N1:N1*N2-1]) = 0;
|
||||
|
||||
L = spdiags([g1*e g2*e_inf a*e g2*e_sup g1*e], [-N2 -1 0 1 N2], N1*N2, N1*N2);
|
||||
|
||||
end
|
89
TP2/advection.m
Executable file
89
TP2/advection.m
Executable file
|
@ -0,0 +1,89 @@
|
|||
function advection(scheme,Nt,Nx)
|
||||
% Script calculant une approximation de la solution du problème
|
||||
% d'advection linéaire 1D.
|
||||
%
|
||||
% Inputs
|
||||
% ------
|
||||
%
|
||||
% scheme : schéma numérique à utiliser.
|
||||
%
|
||||
% Nt : nombre de pas de temps.
|
||||
%
|
||||
% Nx: nombre de pas d'espace.
|
||||
%
|
||||
% Exemple: advection('LaxWendroff',200,500);
|
||||
|
||||
|
||||
% Cadre experimental
|
||||
a=1.; % vitesse
|
||||
L=3; % longueur du domaine spatial.
|
||||
T=1; % longueur de la fenêtre temporelle.
|
||||
ic=0; % condition initiale : 0 -> porte, sinon densité gaussienne
|
||||
|
||||
% Définition de la grille
|
||||
dx=L/(Nx+1);
|
||||
dt=T/(Nt+1);
|
||||
xx=0:Nx+1;
|
||||
xx=xx';
|
||||
%dt=dx/a;
|
||||
|
||||
% Nombre de Courant
|
||||
lambda=a*dt/dx
|
||||
|
||||
% Condition initiale
|
||||
u0=zeros(Nx+2,1);
|
||||
u0=reference(ic,lambda,Nx,dx,0);
|
||||
rmse=zeros(Nt+1,1);
|
||||
|
||||
% Boucle temporelle
|
||||
uh=u0;
|
||||
uh_last = uh;
|
||||
|
||||
% calcul de A en fonction du scheme
|
||||
e = ones(Nx+2, 1);
|
||||
switch scheme
|
||||
case 'explicite'
|
||||
A = spdiags([(1-lambda)*e lambda*e], [0 -1], Nx+2, Nx+2);
|
||||
case 'implicite'
|
||||
A = spdiags([-lambda/2*e e lambda/2*e], [-1 0 1], Nx+2, Nx+2);
|
||||
case 'LaxWendroff'
|
||||
A = spdiags([(lambda/2+lambda^2/2)*e (1-lambda^2)*e (-lambda/2+lambda^2/2)*e], [-1 0 1], Nx+2, Nx+2);
|
||||
end
|
||||
|
||||
for k=1:Nt+1
|
||||
|
||||
% intérieur du domaine
|
||||
switch scheme
|
||||
case 'explicite'
|
||||
uh = A*uh;
|
||||
case 'implicite'
|
||||
uh = A\uh_last;
|
||||
uh_last = uh;
|
||||
case 'LaxWendroff'
|
||||
uh = A*uh;
|
||||
end
|
||||
|
||||
% Conditions aux limites
|
||||
uh(1) = 0;
|
||||
uh(length(uh)) = 0;
|
||||
|
||||
%Erreur RMS
|
||||
uref=reference(ic,lambda,Nx,dx,k);
|
||||
rmse(k)=norm(uh-uref,2)/norm(uref,2);
|
||||
|
||||
% Affichage de la solution
|
||||
figure(1)
|
||||
plot(dx*xx,uh,'b-',dx*xx,uref,'r-');
|
||||
axis([0 L -1 max(abs(u0))+1]);
|
||||
legend('Solution numerique','Solution de reference');
|
||||
xlabel('Domaine spatial')
|
||||
ylabel('u')
|
||||
pause(0.1);
|
||||
end
|
||||
|
||||
% Affichage de l'erreur RMS
|
||||
figure(2)
|
||||
plot(rmse);
|
||||
legend('Erreur RMS')
|
||||
|
||||
end
|
45
TP2/reference.m
Executable file
45
TP2/reference.m
Executable file
|
@ -0,0 +1,45 @@
|
|||
function uref=reference(ic,lambda,Nx,dx,kt)
|
||||
% Evaluation de la solution de référence en les points du maillage.
|
||||
% uref(x)=u0(x-a*t)
|
||||
%
|
||||
% Inputs :
|
||||
% ------
|
||||
%
|
||||
% ic : choix de la condition initiale: 0 -> fonction porte, sinon densité gaussienne.
|
||||
%
|
||||
% lambda: nombre de Courant.
|
||||
%
|
||||
% Nx : Nombre de pas d'espace.
|
||||
%
|
||||
% dx : Pas d'espace.
|
||||
%
|
||||
% kt : Indice du pas de temps courant.
|
||||
%
|
||||
% Output :
|
||||
% ------
|
||||
%
|
||||
% uref : solution évaluée en les noeuds du maillage.
|
||||
%
|
||||
%*****************************************
|
||||
|
||||
uref=zeros(Nx+2,1);
|
||||
if(ic==0)
|
||||
% Fonction porte
|
||||
xi=0.25;
|
||||
xj=1;
|
||||
xx=0:Nx+2;
|
||||
tmp=find((dx*xx>=xi+dx*lambda*kt)&(dx*xx<=xj+dx*lambda*kt));
|
||||
uref(tmp)=2;
|
||||
else
|
||||
% Densité gaussienne
|
||||
gaussian=@(x,m,var)exp(-(x-m)^2/(2*var^2))/(var);
|
||||
|
||||
n0=1;
|
||||
var0=0.1;
|
||||
for j=2:Nx+1
|
||||
uref(j)=(1/5)*gaussian((j-lambda*kt)*dx,n0,var0);
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
Loading…
Reference in a new issue