2021-05-08

不可压库埃特流的数值解 —— 隐式克兰克-尼科尔森(Crank-Nicolson)方法

本文主要分享了安德森的《计算流体力学基础及其应用》一书中:“不可压库埃特 ( Couette ) 流的数值解” 的程序求解。水平有限,请见谅!

文章目录

  • 不可压库埃特流的数值解 —— 隐式克兰克-尼科尔森(Crank-Nicolson)方法
    • 最终结果绘图
    • Matlab 程序
      • testCouette.m
      • Couette.m

最终结果绘图

2021-05-08_第1张图片
2021-05-08_第2张图片

Matlab 程序

testCouette.m

%%
% Author: CXT
% Date: 2021/5/8
% Theme: 不可压库埃特流的数值解;

%%
clc;
clear;
close;

%% 初始条件;
N = 20;
E = 1;% 时间步长参数;
u = zeros(1,N+1);
u(N+1) = 1;

%% 计算;
u0 = u; % 记录初始速度向量;
for i = 1:240
    u = Couette(u,N,E);
    
    switch i % 记录不同时刻的速度向量;
        case 2
          u2 = u;
        case 12
          u12 = u;
        case 36
          u36 = u;
        case 60
          u60 = u;
        case 240
          u240 = u;
    end
end

%% 绘图;
y = 0:(1 - 0)/N:1;
figure;
plot(u0,y,'*-',u2,y,'*-',u12,y,'*-',u36,y,'*-',u60,y,'*-',u240,y,'*-');
legend('0\Delta t','2\Delta t','12\Delta t','36\Delta t','60\Delta t','240\Delta t');
xlabel('u/u_e'),ylabel('y/D');
title("在时间推进过程的不同时刻,非定常不可压库埃特流的速度剖面");

%% 当E = 4000时的结果;
E = 4000;
% 初始流场;
u = zeros(1,N+1);
u(N+1) = 1;
for i = 1:200
    u = Couette(u,N,E);
    
    switch i % 记录不同时刻的速度向量;
        case 40
          u40 = u;
        case 200
          u200 = u;
    end
end
%% 绘图;
figure;
plot(u40,y,'*-',u200,y,'*-');
legend('40\Delta t','200\Delta t');
xlabel('u/u_e'),ylabel('y/D');
title("取E = 4000得到了完全没有物理意义的瞬态速度剖面");

Couette.m

function u_t = Couette(u, N, E)
% u_t = Couette(u, N, E) 不可压库埃特流的数值解
%   u —— 第 t 时间步的无量纲速度向量;
%   N —— 时间截面上网格数目;
%   E —— 时间步长参数;
%   u_t —— 第 t + Delta_t 时间步的无量纲速度向量;

%% 代数方程系数;
A = -E / 2;
B = 1 + E;
K = zeros(1,N+1);
for j = 2:N
    K(j) = (1 - E)*u(j) + E/2*(u(j+1) + u(j-1));
end

%% 托马斯算法求解三对角线性代数方程组;
% 方程组元素;
M = N - 1; % 方程组中的方程个数;
d = B * ones(1,M); % 主对角线元素;
b = A * ones(1,M); % 下对角线元素;
b(1) = 0;
a = A * ones(1,M); % 上对角元素;
a(end) = 0;
c = K(2:N); % 方程组右端项元素;
c(end) = K(end-1) - A; 
% u = zeros(1,M);% 解向量;

% 从第二行元素开始,丢掉第一项;
% 重新计算主对角线上的元素;
for i = 2:M
   d(i) = d(i) - b(i) * a(i-1) / d(i-1);
end

% 重新计算方程右端项元素;
for i = 2:M
   c(i) = c(i) - c(i-1) * b(i) / d(i-1); 
end

% 求解;
u_t = zeros(1,N+1); % u_t:下一时间步的速度向量;
u_t(N) = c(M) / d(M);

for i = M-1:-1:1
    u_t(i+1) = (c(i) - a(i) * u_t(i+2)) / d(i);
end

%% 边界条件;
u_t(1) = 0;
u_t(end) = 1;

end

你可能感兴趣的:(计算流体力学,CFD,安德森,算法)