function [U,X, Y] = Poisson2D(a,b,c,d,Nx,Ny,f)

% resolution du probleme de Poisson avec conditions de Dirichlet homogenes
% sur un rectangle [a b] * [ c d] 

% Arguments d entree
% a = xmin 
% b = xmax 
% c = ymin 
% d = ymax 
% Nx nombre de points de discretisation suivant x 
% Ny nombre de points de discretisation suivant y
% f fonction defini dans un autre fichier (ou fonction handle) qui avec
% deux arguments d entree (x,y) (l appel a la fonction secrit f(x,y) )


% Arguments de sortie 
% U : une matrice de taille Nx *Ny telle que U(i,j) est une approximation
% de u(x_i,y_j) 
% X : une matrice de taille Nx * Ny telle que X(i,j) = x_i = a + i * hx;
% Y : une matrice de taille Nx * Ny telle que Y(i,j) = x_j = b + j * hy;
% Pour visualiser la solution on peut faire surf(X,Y,U) ;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Etape 1 : Initialisation :   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% parametres de discretisation 
% pas de discretisation suivant x
hx = (b-a)/(Nx+1) ;
% pas de discretisation suivant y 
hy = (d-c)/(Ny+1) ;
% nombre d'inconnues 
N = Nx*Ny 

% grille suivant x 
vectx = linspace(a+hx, b-hx, Nx) ;
% grille suivant y 
vecty = linspace(c+hy, d-hy, Ny) ;

% Initialisation du second membre 
F = zeros(N,1) ;
% Initialisation de la matrice a zeros
M = zeros(N,N) ;
% on convertit M en matrice creuse (pour les questions de stockage).
%M = sparse(M) ;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Etape 2 : construction de la matrice   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% la construction est faite dans l ordre suivant 
% 1) coins (bas gauche, bas droit, haut gauche, haut droit) 
% 2) bords (bord bas, bord haut, bord gauche, bord haut)   
% 3) cas general 

% 1) Cas des coins   
% 1a) coin bas gauche
i =1 ; 
j = 1 ; 

N = (i-1) * Ny + j ;
Nhaut = (i-1) * Ny + (j+1) ;
Ndroit = i * Ny + j ;

M(N,N) = 2/hx^2 + 2/hy^2 ; 
M(N,Ndroit) = -1/hx^2 ; 
M(N,Nhaut) = -1/hx^2 ; 
F(N) = f(vectx(i), vecty(j)) ;


% 1b) coin bas droit
% A faire 



% 1c) coin haut gauche
% A faire 

% 1d) coin haut droit
% A faire 

% 2) gestion des bords

% 2a ) bord du bas  

% 2b ) bord du haut  
% A faire 

% 2c ) bord gauche
% A faire 

% 2d ) bord droit
% A faire 


% 3) Cas general  ( i entre 2 et Nx-1, j entre 2 et Ny-1) 
% A faire 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Etape 3 : resolution du systeme lineaire  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

u = M\F ;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Etape 3 : resolution du systeme lineair   
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% on ecrit U sous forme d une matrice de sorte que U(i,j) = u(i,j) 

U =zeros(Nx,Ny) ;
X = zeros(Nx,Ny) ; 
Y = zeros(Nx,Ny) ;


for i = 1 : Nx 
    for j = 1 : Ny 
        X(i,j) = vectx(i) ;
        Y(i,j) = vecty(j) ; 
        N  = (i-1) * Ny + j ;
        U(i,j) = u(N) ;
    end
end







end

