*** Wartungsfenster jeden ersten Mittwoch vormittag im Monat ***

Skip to content
Snippets Groups Projects
Commit c4b6f3af authored by Innerberger, Michael's avatar Innerberger, Michael
Browse files

Add inner loop for multiple kacanov iterations

parent c29bc9e2
No related branches found
No related tags found
No related merge requests found
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
nEmax = 1e4; nEmax = 1e4;
theta = 0.5; theta = 0.5;
coeff = 1; coeff = 1;
lambda = 0.1;
%% initialization %% initialization
mesh = Mesh.loadFromGeometry('unitsquare'); mesh = Mesh.loadFromGeometry('unitsquare');
...@@ -30,29 +31,42 @@ P = LoFeProlongation(fes); ...@@ -30,29 +31,42 @@ P = LoFeProlongation(fes);
%% adaptive loop %% adaptive loop
ell = 0; ell = 0;
[nElements, estimator, iterationDiff, exactDiff] = deal(zeros(1000,1)); [nElements, estimator, exactDiff, nIter] = deal(zeros(1000,1));
meshSufficientlyFine = false; meshSufficientlyFine = false;
while ~meshSufficientlyFine while ~meshSufficientlyFine
ell = ell + 1; ell = ell + 1;
freeDofs = getFreeDofs(fes);
A = assemble(blf); A = assemble(blf);
F = assemble(lf); A = A(freeDofs,freeDofs);
K = assemble(perturbation); K = assemble(perturbation);
Aref = A + K; Aref = A + K(freeDofs,freeDofs);
Fref = assemble(lfRef); Fref = assemble(lfRef);
uref.setFreeData(Aref \ Fref(freeDofs));
freeDofs = getFreeDofs(fes); % inner iteration: sufficiently many kacanov iterations
u.setFreeData(A(freeDofs,freeDofs) \ F(freeDofs)); n = 0;
uref.setFreeData(Aref(freeDofs,freeDofs) \ Fref(freeDofs)); solutionAccurateEnough = false;
while ~solutionAccurateEnough
n = n + 1;
F = assemble(lf);
u.setFreeData(A \ F(freeDofs));
eta2 = estimate(blf, lf, u);
v = u.data(freeDofs) - uold.data(freeDofs);
iterationDiff = sqrt(v * A * v');
uold.setData(u.data);
solutionAccurateEnough = (iterationDiff < lambda*sqrt(sum(eta2)));
end
eta2 = estimate(blf, lf, u);
nElements(ell) = mesh.nElements; nElements(ell) = mesh.nElements;
estimator(ell) = sqrt(sum(eta2)); estimator(ell) = sqrt(sum(eta2));
v = u.data - uold.data; v = u.data(freeDofs) - uref.data(freeDofs);
iterationDiff(ell) = sqrt(v * A * v');
v = u.data - uref.data;
exactDiff(ell) = sqrt(v * A * v'); exactDiff(ell) = sqrt(v * A * v');
printLogMessage('number of elements: %d, estimator: %.2e', mesh.nElements, estimator(ell)); nIter(ell) = n;
printLogMessage('number of elements: %d, estimator: %.2e after %d iterations', ...
mesh.nElements, estimator(ell), n);
meshSufficientlyFine = (mesh.nElements > nEmax); meshSufficientlyFine = (mesh.nElements > nEmax);
...@@ -70,15 +84,19 @@ end ...@@ -70,15 +84,19 @@ end
figure() figure()
idx = 1:ell; idx = 1:ell;
yyaxis left
ylabel('error / estimator')
loglog(nElements(idx), estimator(idx), '-o', 'LineWidth', 2) loglog(nElements(idx), estimator(idx), '-o', 'LineWidth', 2)
hold on hold on
loglog(nElements(idx), iterationDiff(idx), '-o', 'LineWidth', 2)
loglog(nElements(idx), exactDiff(idx), '-o', 'LineWidth', 2) loglog(nElements(idx), exactDiff(idx), '-o', 'LineWidth', 2)
shift = estimator(1)*nElements(1); shift = estimator(1)*nElements(1);
loglog(nElements(idx), shift*nElements(idx).^(-1/2), '--', 'LineWidth', 2, 'Color', 'k') loglog(nElements(idx), shift*nElements(idx).^(-1/2), '--', 'LineWidth', 2, 'Color', 'k')
legend('\eta_H', '|u^k_H - u^{k-1}_H|_{H^1}', '|u_H - u^{k}_H|_{H^1}', '#T_H^{-1/2}') yyaxis right
semilogx(nElements(idx), nIter(idx), '-x', 'LineWidth', 2)
ylim([0, max(nIter)+1])
legend('\eta_H', '|u_H - u^{k}_H|_{H^1}', '#T_H^{-1/2}', 'iteration count')
ylabel('number of iterations')
xlabel('#T_H') xlabel('#T_H')
ylabel('error / estimator')
title('Kacanov iteration for non-symmetric / indefinite problem') title('Kacanov iteration for non-symmetric / indefinite problem')
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment