.
This commit is contained in:
parent
52609c6099
commit
43bc7df338
4 changed files with 131 additions and 0 deletions
48
Sheet6/Ex6A.m
Normal file
48
Sheet6/Ex6A.m
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
clear; clc; close all;
|
||||||
|
pList = [5, 10, 20, 100];
|
||||||
|
nIter = 9;
|
||||||
|
|
||||||
|
figure;
|
||||||
|
tiledlayout(2,2)
|
||||||
|
for ip = 1:length(pList)
|
||||||
|
p = pList(ip);
|
||||||
|
|
||||||
|
f = @(x) 2*p^3*x./(p^2*x.^2+1).^2; %RHS
|
||||||
|
lambda = @(x) 1; %DIffusion coefficient
|
||||||
|
|
||||||
|
u_exact = @(x) atan(p*x);
|
||||||
|
|
||||||
|
x = linspace(-1,1,10); %initial uniform mesh (includes x=0)
|
||||||
|
|
||||||
|
for it = 1:nIter %adaptive FEM loop
|
||||||
|
[K,F] = assemble_1D(x,lambda,f); %assemble global stiffness matrix K and load vector F
|
||||||
|
%Neumann boundary conditions at x=1
|
||||||
|
F(end) = F(end) + p/(p^2+1);
|
||||||
|
%Dirichlet boundary conditions at x=-1
|
||||||
|
K(1,:) = 0;
|
||||||
|
K(1,1) = 1;
|
||||||
|
F(1) = -atan(p);
|
||||||
|
|
||||||
|
u = K \ F;
|
||||||
|
|
||||||
|
if it < nIter % h-adaptivity loop
|
||||||
|
eta = flux_jump(x,u,lambda);
|
||||||
|
x = h_adapt(x,eta,0.3);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
u_ex = u_exact(x(:)); % force column vector
|
||||||
|
err_inf = max(abs(u - u_ex));
|
||||||
|
nexttile
|
||||||
|
plot(x,u,'-o','LineWidth',1.5); hold on
|
||||||
|
plot(x,u_ex,'--','LineWidth',1.5)
|
||||||
|
title(['p = ',num2str(p)])
|
||||||
|
xlabel('x'), ylabel('u')
|
||||||
|
legend('FEM','exact','Location','best')
|
||||||
|
grid on
|
||||||
|
|
||||||
|
fprintf('p = %d\n', p);
|
||||||
|
fprintf('error = %.3e\n\n', err_inf);
|
||||||
|
end
|
||||||
|
|
||||||
|
sgtitle('Exercise 6A: h-adaptivity and exact solution comparison')
|
||||||
23
Sheet6/Ex6B.m
Normal file
23
Sheet6/Ex6B.m
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
clear; clc;
|
||||||
|
lambda = @(x) (x < 1/sqrt(2)) + 10*(x >= 1/sqrt(2)); %diffusion coefficient
|
||||||
|
f = @(x) 0; %homogeneous RHS
|
||||||
|
x = linspace(0,1,6); %coarse initial mesh, doesn't include x_m
|
||||||
|
nIter = 6;
|
||||||
|
|
||||||
|
for it = 1:nIter
|
||||||
|
[K,F] = assemble_1D(x,lambda,f); %assemble
|
||||||
|
K(1,:) = 0; K(1,1) = 1; F(1) = 0; % Dirichlet BC at x=0
|
||||||
|
K(end,:) = 0; K(end,end) = 1; F(end) = 1; % Dirichlet BC at x=1
|
||||||
|
u = K\F;
|
||||||
|
|
||||||
|
if it < nIter %h-adaptivity loop
|
||||||
|
eta = flux_jump(x, u, lambda);
|
||||||
|
x = h_adapt(x,eta,0.4);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
figure
|
||||||
|
plot(x,u,'-o','LineWidth',1.5)
|
||||||
|
xlabel('x'), ylabel('u')
|
||||||
|
title('Ex6B, h-adaptivity with coefficient jump')
|
||||||
|
grid on
|
||||||
43
Sheet6/Ex6C.m
Normal file
43
Sheet6/Ex6C.m
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
clear; clc; close all;
|
||||||
|
p = 70;
|
||||||
|
%p=-70;
|
||||||
|
lambda = @(x) 1; %constant diffusion
|
||||||
|
f = @(x) 0; %homogeneous RHS
|
||||||
|
|
||||||
|
N = 30; % Initial mesh (uniform)
|
||||||
|
x = linspace(0,1,N)';
|
||||||
|
|
||||||
|
nIter = 8;
|
||||||
|
|
||||||
|
for it = 1:nIter
|
||||||
|
[K,F] = assemble_1D(x,lambda,f); %assemble
|
||||||
|
for i = 1:length(x)-1 %convection term added manually
|
||||||
|
h = x(i+1) - x(i);
|
||||||
|
Ke_conv = p/2 * [-1 1; -1 1];
|
||||||
|
K(i:i+1,i:i+1) = K(i:i+1,i:i+1) + Ke_conv;
|
||||||
|
end
|
||||||
|
K(1,:) = 0; K(1,1) = 1; F(1) = 0; % Dirichlet BC at x=0
|
||||||
|
K(end,:) = 0; K(end,end) = 1; F(end) = 1; % Dirichlet BC at x=1
|
||||||
|
|
||||||
|
u = K\F;
|
||||||
|
|
||||||
|
if it < nIter
|
||||||
|
Nn = length(x); %initialize indicator
|
||||||
|
eta = zeros(Nn,1);
|
||||||
|
for j = 2:Nn-1 %interior nodes only
|
||||||
|
ul = (u(j)-u(j-1))/(x(j)-x(j-1)); %left derivative
|
||||||
|
ur = (u(j+1)-u(j))/(x(j+1)-x(j)); %right derivative
|
||||||
|
%Jump in convection-diffusion flux
|
||||||
|
Jl = -ul + p*u(j);
|
||||||
|
Jr = -ur + p*u(j);
|
||||||
|
eta(j) = abs(Jr - Jl);
|
||||||
|
end
|
||||||
|
x = r_adapt(x, eta);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
figure
|
||||||
|
plot(x,u,'-o','LineWidth',1.5)
|
||||||
|
xlabel('x'), ylabel('u')
|
||||||
|
title(['Ex6C, r-adaptivity, Péclet p = ',num2str(p)])
|
||||||
|
grid on
|
||||||
17
Sheet6/assemble_1D.m
Normal file
17
Sheet6/assemble_1D.m
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
function [K,F] = assemble_1D(x,lambda,f)
|
||||||
|
N = length(x);
|
||||||
|
K = zeros(N);
|
||||||
|
F = zeros(N,1);
|
||||||
|
|
||||||
|
for i = 1:N-1
|
||||||
|
h = x(i+1)-x(i);
|
||||||
|
xm = (x(i)+x(i+1))/2; %mid point evaluation
|
||||||
|
lam = lambda(xm);
|
||||||
|
Ke = lam/h * [1 -1; -1 1]; %exact P1 stiffness matrix
|
||||||
|
xm = (x(i)+x(i+1))/2;
|
||||||
|
Fe = f(xm)*h/2 * [1;1]; %mid point quadrature for RHS
|
||||||
|
%assembly into global system
|
||||||
|
K(i:i+1,i:i+1) = K(i:i+1,i:i+1) + Ke;
|
||||||
|
F(i:i+1) = F(i:i+1) + Fe;
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Add table
Add a link
Reference in a new issue