www.pudn.com > AFEM@matlab.rar > circle.m, change:2006-11-16,size:3388b


function circle
% CIRCLE simulates adaptive grids for a problem with moving circlular
% singularities.
%

% L. Chen & C. Zhang 11-15-2006

%--------------------------------------------------------------------------
% Initialize Figure Window
%--------------------------------------------------------------------------
figure(1); set(gcf,'Units','normal'); set(gcf,'Position',[0.02,0.1,0.8,0.6]);

%--------------------------------------------------------------------------
% Parameters
%--------------------------------------------------------------------------
theta = 0.3; theta_c = 0.1; t0 = 1.1; 

%--------------------------------------------------------------------------
% PreStep 0: generate initial mesh
%--------------------------------------------------------------------------
node = [-1,-1; 0,-1; 1,-1; -1,0; 0,0; 1,0; -1,1; 0,1; 1,1];
elem = [2,5,1; 3,6,2; 4,1,5; 5,2,6; 5,8,4; 7,4,8; 6,9,5; 8,5,9];
Dirichlet = []; Neumann = [];
mesh = getmesh(node,elem,Dirichlet,Neumann);

%--------------------------------------------------------------------------
% PreStep 1: uniform mesh refinement
%--------------------------------------------------------------------------
for i=1:4
    mesh = bisection(mesh,ones(size(mesh.elem,1),1),1);
end
mesh.solu = u(mesh.node,t0); % now we pretent we know exact solution

%--------------------------------------------------------------------------
% PreStep 2: mesh refinement of initial data
%--------------------------------------------------------------------------
for i=1:6
    eta = estimate(mesh);
    [mesh,eta] = bisection(mesh,eta.^2,theta);
end

%--------------------------------------------------------------------------
% AFEM
%--------------------------------------------------------------------------
for t = t0:-0.1:0.25
    
    % Coarsen
    for i = 1:5,
        mesh.solu = u(mesh.node,t); % now we pretent we know exact solution
        eta = estimate(mesh).^2;
        [mesh,eta] = coarsening(mesh,eta,theta_c);
    end

    % Refine
    for i = 1:5,
        mesh.solu = u(mesh.node,t); % now we pretent we know exact solution
        eta = estimate(mesh).^2;
        [mesh,eta] = bisection(mesh,eta,theta);
    end

    mesh.solu = u(mesh.node,t);

    % Graphic representation  
    subplot(1,2,2); hold off; 
    trisurf(mesh.elem,mesh.node(:,1),mesh.node(:,2),zeros(size(mesh.node,1),1));
    view(2), axis equal, axis off;
    title(sprintf('Mesh at time %5.4f',t), 'FontSize', 14)

    subplot(1,2,1); hold off;
    trisurf(mesh.elem, mesh.node(:,1), mesh.node(:,2), mesh.solu', ...
        'FaceColor', 'interp', 'EdgeColor', 'interp');
    view(60,50), axis equal, axis off;
    title('Solution to the circle problem', 'FontSize', 14)

    pause(0.2)   

end

mesh

%--------------------------------------------------------------------------
% End of function CIRCLE
%--------------------------------------------------------------------------

%--------------------------------------------------------------------------
% Sub functions called by CIRCLE
%--------------------------------------------------------------------------

function z = u(p,t) 
% exact solution
%
% NOTE
%    Singularities is on a moving circle
%
% epsilon is the width of circle

epsilon = 0.05;
r = max(sum(p.^2,2).^(1/2),eps);
z = exp(-((r-0.5*t)/epsilon).^2);
%--------------------------------------------------------------------------