sandbox/easystab/multi_domain_2D_tri.m

    Just like for multi_domain_1D.m and multi_domain_2D.m but with an interesting domain (that we could not do otherwise than using multi-domains). Please check these other codes for the detailed explanations.

    clear all; clf; 
    
    % parameters 
    nx=20; % number of grid nodes in x
    ny=20; % number of grid nodes in y
    method='cheb'; % which discretization to use
    pts=9;  % how mnay points in the finite difference stencil
    
    % differentiation 
    [d.x,d.xx,d.wx,x]=dif1D(method,0,1,nx,pts);
    [d.y,d.yy,d.wy,y]=dif1D(method,0,1,ny,pts);
    [D1,l1,X1,Y1,Z1,I1,NN1]=dif2D(d,x,y);
    
    [d.x,d.xx,d.wx,x]=dif1D(method,1,2,nx,pts);
    [d.y,d.yy,d.wy,y]=dif1D(method,0,1,ny,pts);
    [D2,l2,X2,Y2,Z2,I2,NN2]=dif2D(d,x,y);
    
    [d.x,d.xx,d.wx,x]=dif1D(method,0,1,nx,pts);
    [d.y,d.yy,d.wy,y]=dif1D(method,1,2,ny,pts);
    [D3,l3,X3,Y3,Z3,I3,NN3]=dif2D(d,x,y);
    
    D.x=blkdiag(D1.x,D2.x,D3.x);
    D.y=blkdiag(D1.y,D2.y,D3.y);
    D.xx=blkdiag(D1.xx,D2.xx,D3.xx);
    D.yy=blkdiag(D1.yy,D2.yy,D3.yy);
    I=blkdiag(I1,I2,I3);
    Z=blkdiag(Z1,Z2,Z3);
    
    NN=NN1+NN2+NN3;
    f1=(1:NN1)'; 
    f2=(f1(end)+(1:NN2))';
    f3=(f2(end)+(1:NN3))';
    
    X=[X1(:);X2(:);X3(:)];
    Y=[Y1(:);Y2(:);Y3(:)];
    

    We solve simply \displaystyle f_{xx}+f_{yy}=0

    % System matrices
    A=D.xx+D.yy;
    b=0*X;
    

    For validation, we use an analytical solution of the Poisson problem with Dirichlet boundary conditions. \displaystyle f(x,y)=3x^2y-y^3

    % the analytical solution
    ftheo=3*X.^2.*Y-Y.^3;
    

    To get the connections, it is good to draw a sketch of how the domains are located with respect to each others.

    % Boundary conditions
    dir=[f1([l1.left; l1.bot]); ...
        f2([l2.right; l2.top; l2.bot]); ...
        f3([l3.left; l3.top; l3.right])];
    loc=[dir; f1(l1.right);f2(l2.left);f1(l1.top);f3(l3.bot)];
    C=[I(dir,:); ...
        I(f1(l1.right),:)-I(f2(l2.left),:); ...
        D.x(f1(l1.right),:)-D.x(f2(l2.left),:); ...
        I(f1(l1.top),:)-I(f3(l3.bot),:); ...
        D.y(f1(l1.top),:)-D.y(f3(l3.bot),:)];
    
    A(loc,:)=C;
    b(loc)=C*ftheo;
    
    % solve system
    f=A\b;
    
    % validation
    err=norm(f-ftheo,2)
    
    mesh(X1,Y1,reshape(f(f1),ny,nx),'edgecolor','b');
    hold on
    mesh(X2,Y2,reshape(f(f2),ny,nx),'edgecolor','r');
    mesh(X3,Y3,reshape(f(f3),ny,nx),'edgecolor','m');
    view(72,50)
    
    xlabel('x');ylabel('y');
    legend('domain 1','domain 2','domain 3');
    
    set(gcf,'paperpositionmode','auto');
    print('-dpng','-r80','multi_domain_2D_tri2.png');
    

    Here is the figure produced by the code as it is:

    And here is an other test with \displaystyle f_{xx}+f{yy}=-1 and homogeneous boundary conditions.

    %}