clear;
format long;
fc=1;    % f constant
bc=0.;     % The Dirichlet boundary condition, constant
W=1;   % the width of the rectangle
L=2.0;    % the length of the rectangle
N=20;      % the number of elements in Y direction
M=40;       % the number of elements in X direction
dx = L/M;    % dx
dy = W/N;    % dy
D=(N+1)*(M+1);    % The dimension of the global stiffniss matrix or number of nodes
s=zeros(D,D);      % global stiffness matrix
f=zeros(D,1);       % load factor
v=zeros(N+1,M+1);    % the collocated results for plotting
xindex=0;
yindex=0;
x1=0; x2=0; x3=0; x4=0;   % (x1,x2,x3) and (x4,x2,x3) are summits of the two trangles in one rectangle element
j1=0; j2=0;
% generating the global stiffness matrix and load vectors
for yindex = 1:N
    for xindex = 1:M
        x1 = xindex + (yindex-1)*(M+1);
        x2 = 1+ x1;
        x3 = xindex + yindex*(M+1);
        x4 = 1+ x3;

        j1 = dx*dy;  % the Jacobian of the first trangle
        s(x1,x1) = s(x1,x1)+(dx^2+dy^2)/(2*j1);
        s(x1,x2) = s(x1,x2)-dy^2/(2*j1);
        s(x1,x3) = s(x1,x3)-dx^2/(2*j1);
        s(x2,x1) = s(x2,x1)-dy^2/(2*j1);
        s(x2,x2) = s(x2,x2)+dy^2/(2*j1);
        s(x2,x3) = s(x2,x3);
        s(x3,x1) = s(x3,x1)-dx^2/(2*j1);
        s(x3,x2) = s(x3,x2);
        s(x3,x3) = s(x3,x3)+dx^2/(2*j1);
        f(x1,1) = f(x1,1)+ fc*j1/6;
        f(x2,1) = f(x2,1)+ fc*j1/6;
        f(x3,1) = f(x3,1)+ fc*j1/6;   %  Process the first trangle in one block

        j2 = dx*dy;   % the Jacobian of the second trangle
        s(x4,x4) = s(x4,x4)+(dx^2+dy^2)/(2*j2);
        s(x4,x2) = s(x4,x2)-dx^2/(2*j2);
        s(x4,x3) = s(x4,x3)-dy^2/(2*j2);
        s(x2,x4) = s(x2,x4)-dx^2/(2*j2);
        s(x2,x2) = s(x2,x2)+dx^2/(2*j2);
        s(x2,x3) = s(x2,x3);
        s(x3,x4) = s(x3,x4)-dy^2/(2*j2);
        s(x3,x2) = s(x3,x2);
        s(x3,x3) = s(x3,x3)+dy^2/(2*j2);
        f(x4,1) = f(x4,1)+ fc*j2/6;
        f(x2,1) = f(x2,1)+ fc*j2/6;
        f(x3,1) = f(x3,1)+ fc*j2/6;  %  Process the second trangle
    end
end

% applying BC
for xindex=1:M+1
    s(xindex,:) = zeros(1,D); s(xindex,xindex)=1; f(xindex,1)=bc;
    s(xindex+N*(M+1),:) = zeros(1,D);
    s(xindex+N*(M+1),xindex+N*(M+1))=1;
    f(xindex+N*(M+1),1)=bc;
end         % the bottome and upper BC
for yindex=1:N-1
    s(1+yindex*(M+1),:)=zeros(1,D);
    s(1+yindex*(M+1),1+yindex*(M+1))=1;
    f(1+yindex*(M+1),1)=bc;
    s((1+yindex)*(M+1),:)=zeros(1,D);
    s((1+yindex)*(M+1),(1+yindex)*(M+1))=1;
    f((1+yindex)*(M+1),1)=bc;
end         % the left and right side BC

q=s\f;      % solve q

% generating visulized results
for yindex=1:N+1
    for xindex=1:M+1
        v(yindex,xindex) = q((M+1)*(yindex-1)+xindex);
    end
end
[X,Y] = meshgrid(0:dx:L,0:dy:W);
[C,h] = contourf(X,Y,v);
clabel(C,h)
colormap cool
%axis equal tight