用递归法实现多重网格法——MATLAB
FMG运行图
MATLAB递归代码
clear; clc;
global f1
f1 = fopen('out1.txt', 'w'); %该文件只是为了测试
k = 5; ks = 1; % 总的网格层、开始层
gamma = 1; ncy = 1; % 类型(V or W), 总的循环次数
nu0 = 6; nu1 =2; nu2 = 1;
fmg(k, ks, nu0, nu1, nu2, gamma, ncy)
fclose(f1);
a = load('out1.txt');
figure(1)
plot(a, 'bo-', 'LineWidth', 1.5);
% FMG
function fmg(k, ks, nu0, nu1, nu2, gamma, ncy)
global f1
if k == ks
if ks == 1
for i = 1 : nu0
% 迭代代码
fprintf(f1, '%d\n', k);
end
else
for j = 1 : ncy
cycle(k, nu0, nu1, nu2, gamma);
end
end
else
if k > ks
fmg(k - 1, ks, nu0, nu1, nu2, gamma, ncy)
% 向高一层插值代码
for j = 1 : ncy
cycle(k, nu0, nu1, nu2, gamma);
end
end
end
end
function cycle(k, nu0, nu1, nu2, gamma)
global f1
if k == 1
for i = 1 : nu0
% 迭代代码
fprintf(f1, '%d\n', k);
end
else
for i = 1 : nu1
% 迭代代码
fprintf(f1, '%d\n', k);
end
for j = 1 : gamma
cycle(k - 1, nu0, nu1, nu2, gamma);
end
for i = 1 : nu2
% 迭代代码
fprintf(f1, '%d\n', k);
end
end
end
运行图
由上图可知,实现了FMG循环的功能。
参考文献
- Venner C.H., Lubrecht A.A. Multilevel methods in lubrication [M]. Elsevier, 2000.