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*N
1)+. 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) | ||
et | (2) |
sur | (3) | ||
et | (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) | ||
et | (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()