21.4.1999
>> sess2
% export decomposed geometry and boundary cond. from BOUNDARY menu.
[p,e,t]=initmesh(g,'Hmax',5,'jiggle','off');
pdeplotn(p,e,t)
>> t(1:3,:)
ans =
6 4 1 7 8 9 3 5 10 5 2 7
1 3 2 5 4 6 6 8 6 9 7 10
11 9 11 10 9 10 9 9 11 10 11 11
t1ind=t(1:3,1)'
pp1=p(:,t1ind)
hold on
fill(pp1(1,:),pp1(2,:),'g')
figure hold on fill(pp1(1,:),pp1(2,:),'g') axis([0.4 1.8 -0.2 0.8]) text(pp1(1,1),pp1(2,1),'P1') text(pp1(1,2),pp1(2,2),'P2') text(pp1(1,3),pp1(2,3),'P3') plot(pp1(1,[2,3,3]),pp1(2,[2,2,3]),'--') text(1.5,0.15,'Y1=y3-y2') text(1.25,-0.05,'X1=x3-x2')The above Matlab commands produce this figure where we have the same notation as in PDEtool manual p. 4-6 (With capitalized letters on the LHS).
x=pp1(1,:);y=pp1(2,:);
X1=x(2)-x(3);Y1=y(2)-y(3);
X2=x(3)-x(1);Y2=y(3)-y(1);
X3=x(1)-x(2);Y3=y(1)-y(2);
% Here is the "master" (local) matrix Kt, meaning K associated to triangle t.
Kt=[X1*X1+Y1*Y1,X1*X2+Y1*Y2,X1*X3+Y1*Y3;
X2*X1+Y2*Y1,X2*X2+Y2*Y2,X2*X3+Y2*Y3;
X3*X1+Y3*Y1,X3*X2+Y3*Y2,X3*X3+Y3*Y3];
[A,a1,a2,a3]=pdetrg(p,t)
Kt=Kt/(4*A(1))
Notice that we get the areas (etc.) of all triangles at once. Let's just check
the first one.
det([1,1,1;x;y])/2 A(1)Remember the area of a triangle formula.
>> dbstop at 1 in lassema >> K=lassema(p,t,f) 10 nt=size(t,2); % Nr. of triangles K>> dbtype K>> dbstep K>> dbstep ... % Look at the local variables, like K . K> dbclear 1 K> dbquit
>> b
b =
1 1 1 1
1 1 0 1
1 1 1 1
1 1 1 1
1 1 48 1
3 3 49 1
48 48 48 48
48 48 48 48
49 49 49 49
49 49 48 49
43 43 0 0
120 121 0 0
A bit of a mystery, note that 120 is the ascii code for x and 121 for y.
What matters for us here is row 2. There 1 means Dirichlet and 0 means
Neumann.
>> dirind=find(b(2,:)==1)
dirind =
1 2 4
>> neuind=find(b(2,:)==0)
neuind =
3
Choosing "show edge labels" in Boundary menu we see the coincidence.
function K=lassema(p,t)
%
% Assembles the stiffness matrix w.r.t. the mesh defined by p and t.
% p and t can be exported from PDEtool.
%
% This function assembles only the area integral contributions.
% The function lassemb will take care of the boundaries
%
% This can be extended into
% function [K,M,F]=lassema(p,t,c,a,f)
%
% The intermediate step would be a "Poisson assembler"
%
function [K,F]=lassema(p,t,f)
%
nt=size(t,2); % Nr. of triangles
np=size(p,2); % Nr. of points
K=sparse(np,np); % Initialize stiffness matrix
for n=1:nt % The big (and only) loop running through each element,
% i.e. each triangle t.
tri=t(1:3,n); The local current triangle
pt=p(:,tri);
% Form the local matrix Kt (see above)
% How to find the right slots in the global K where to add the current
% contribution?
% Here's a nice trick, be sure to understand it.
ii=tri(:,[1 1 1]) % One way to repeat the column 3 times
jj=ii'
[ii(:) jj(:)] % This is just for you to see what's going on
% Now comes the main point, the update step of K
K=K+sparse(ii(:),jj(:),Kt(:),np,np);
full(K) % For your display, to be removed
end;
%%%%%%%%%% and of assembly of K (version 1 of lassema) %%%%%%%%%%%%%%%%%%%
% RHS tri_ind=t(1:3,:);tri_ind=tri_ind(:); x=p(1,tri_ind)';y=p(2,tri_ind)'; x3=reshape(x,3,nt);y3=reshape(y,3,nt); x=sum(x3)/3;y=sum(y3)/3;When using the mid-point integration rule we evaluate the function f at the barycenters. Now, remember that the f in the toolbox is given as a string of type f='x.^2+y.^2' or f='0' or f:='ff(x,y)' , where ff is an m-file ff.m. In any case (more precisely in the non-constant case) the symbols x and y are used as argument names for the function. (A bit questionable but convenient)
Hence f=eval(f) gives the vector of values at the barycenters. Here it was necessary to use the names x and y for the vectors of x- and y- coordinates of the barycenters respectively.
(Note that in the general elliptic case the coefficient functions c and a are treated similarly.)
Thus we could continue :
f=eval(f) F=zeros(np,1); if any(f) % Test if there's any non-zero component for i=1:nt % Only this loop is needed, as in the stiffness matrix case. .. end; end;So there is just to fill in the details, add comments and test. You could even write a demo that shows also graphically the process triangle by triangle.
Note that this is totally independent of the geometry.
Let's take the generalizations for lassema here anyway now.
function K=lassema(p,t,f) % 1. version (Poisson) %function [K,F]=lassema(p,t,f) % 2. version (Poisson) %function [K,M,F]=lassema(p,t,c,a,f) % Final version for general elliptic % % Assembles the stiffness matrix w.r.t. the mesh defined by p and t. % p and t can be exported from PDEtool.% % This function assembles only the area integral contributions. % The function lassemb will take care of the boundaries % % % The final version returns area integral contributions of % 1. stiffness matrix K % 2. mass matrix M % 3. RHS FContinue with boundary assembly