J.Ph. Chancelier1
On cherche ici à mettre en
uvre la méthode de décomposition
de domaine décrite dans la partie Calcul scientifique du cours
Mopsi. On cherche à résoudre une équation de laplace en dimension 1.
Écrire tout d'abord une fonction qui résout par une méthode de
différences finies le problème de Dirichlet précédent.
N désigne le nombre de points de discrétisation à utiliser.
La fonction doit renvoyer deux vecteurs de taille N, u
et x et le pas de discrétisation h. u(i) est la
solution calculée au point x(i) avec x(1)=a et
x(N)=b.
function [u,x,h]=diri(a,ua,b,ub,N)
Cette fonction peut être utilisée maintenant pour résoudre le problème général (on sait bien sur résoudre le problème à la main dans ce cas simpe 1-D) mais aussi résoudre les problèmes sur les sous domaines.
Supposons ici que
soit discrétisé en
points.
et soit
le pas de discrétisation. Les points de discrétisation
sont donnés par xx=linspace(a,b,2*N1)+. On décompose
le domaine
en
et
avec un recouvrement.
Soit
on utilisera
et
.
Programmer l'algorithme itératif de résolution par décomposition de
domaine avec recouvrement dans sa version parallèle.
Soit
les solutions sur chaque domaines à l'itération
, on calcule
par
sur |
(1) | ||
| (2) |
sur |
(3) | ||
| (4) |
On choisira le nombre de points de discrétisation de chaque sous
problème de façon à ce que les points de discrétisation coincident
avec les points
.
On dessinera au cours des itérations les solutions
et
et on calculera la norme de l'erreur que l'on tracera aussi en
fonction des itérations.
On regardera par simulation l'influence de
qui contrôle l'a
longueur de la zone de recouvrement.
On utilise cette fois une condition de Dirichlet pour le calcul de
:
sur |
(5) | ||
| (6) |
et une condition de Neumann pour le calcul de
:
sur |
(7) | ||
et |
(8) |
et
étant remis à jours par
et
;
On choisira ici
et
, on que cet algorithme
converge pour
tel que :
On cherche ici à utiliser pvm pour paralléliser la résolution
par décomposition de domaine.
Un programme principal decomp-master.sce est utilisé pour
lancer deux programmes Scilab esclaves. Chaque esclave
est responsable du calcul sur l'un des sous domaines et communique
à chaque itération la valeur qui sera utilisée comme condition
de Dirichlet par l'autre esclave
On donne ici le code Scilab du programme maître, le code
du programme esclave restant à écrire decomp-slave.sce.
ok=pvm_start() // je démarre pvm
if ok<>0 then disp('pvm daemon already active'),end;
N=2; // je lance 2 nouveau scilab
path=get_absolute_file_path('decomp-master.sce');
[task_id,numt] = pvm_spawn(path+'/decomp-slave.sce',N)
if numt<0 then disp(['pvm_spawn aborts to create a new process']); end
// nombre d'itérations
n_step = 50;
// envois du nombre d'itérations
// et du numero du sous domaine ŕ résoudre
for i=1:2
pvm_send(task_id(i),[i,n_step],0);
end
// itération avec échange des conditions de dirichlet
for k=1:n_step
bb1= pvm_recv(task_id(1),0);
bb2= pvm_recv(task_id(2),0);
pvm_send(task_id(1),bb2,0);
pvm_send(task_id(2),bb1,0);
end
// les solutions sur chaque domaine
u1=pvm_recv(task_id(1),0);
x1=pvm_recv(task_id(1),0);
u2=pvm_recv(task_id(2),0);
x2=pvm_recv(task_id(2),0);
// un graphique
plot2d(x1,u1);
plot2d(x2,u2);
x_message(['Job finished'])
pvm_halt()