使用有限体积法(FVM)在MATLAB中实现流体力学求解
一、基本框架代码(二维稳态不可压缩流动)
%% 初始化参数
domainX = 0.1; domainY = 0.01; % 计算域尺寸
gridX = 50; gridY = 20; % 网格数
stepX = domainX / gridX; stepY = domainY / gridY;
% 物理参数
density = 1.2; viscosity = 1.8e-5; kinematicViscosity = viscosity / density; % 空气物性
reynolds = 100; avgVelocity = reynolds * kinematicViscosity / (2 * domainY); % 雷诺数与平均速度
%% 网格与变量定义
posX = linspace(stepX / 2, domainX - stepX / 2, gridX);
posY = linspace(stepY / 2, domainY - stepY / 2, gridY);
[GridX, GridY] = meshgrid(posX, posY);
% 初始化场变量(速度、压力)
velX = zeros(gridX + 1, gridY + 2); % x方向速度(面中心)
velY = zeros(gridX + 2, gridY + 1); % y方向速度(面中心)
pressure = zeros(gridX + 2, gridY + 2); % 压力(单元中心)
%% 边界条件设置
% 入口(左边界)
velX(:, 1) = avgVelocity;
% 出口(右边界)
pressure(:, end) = 0;
% 壁面(上下边界)
velX(1, :) = 0; velX(end, :) = 0;
velY(:, 1) = 0; velY(:, end) = 0;
%% 离散参数
relaxVel = 0.3; relaxPressure = 0.2; % 松弛因子
maxIterations = 1e4; tolerance = 1e-5;
%% SIMPLE算法主循环
for iteration = 1:maxIterations
% 动量方程离散(x方向)
[tempVelX, fluxX, diffX] = FVM_xMomentum(velX, velY, pressure, density, stepX, stepY, viscosity);
% 动量方程离散(y方向)
[tempVelY, fluxY, diffY] = FVM_yMomentum(velX, velY, pressure, density, stepX, stepY, viscosity);
% 压力修正方程
[pressCorr, coeffPress] = FVM_pressureCorrection(tempVelX, tempVelY, pressure, stepX, stepY);
% 速度修正
[velX, velY] = FVM_velocityCorrection(tempVelX, tempVelY, pressCorr, relaxVel, relaxPressure);
% 压力更新
pressure = pressure + relaxPressure * pressCorr;
% 收敛判断
resVel = max(abs(velX - tempVelX));
resPress = max(abs(pressCorr(:)));
if max(resVel, resPress) < tolerance
break;
end
end
%% 后处理
figure;
quiver(squeeze(velX(2:end-1, :)), squeeze(velY(2:end-1, :)));
title('速度场分布');
xlabel('x'); ylabel('y');
%% 核心函数定义
function [newVelX, fluxTerm, diffTerm] = FVM_xMomentum(velX, velY, pressure, density, stepX, stepY, viscosity)
% x方向动量方程离散
[numX, numY] = size(velX);
fluxTerm = zeros(numX, numY); diffTerm = zeros(numX, numY);
for i = 2:numX-1
for j = 2:numY-1
% 对流项(中心差分)
fluxTerm(i,j) = 0.5*density*(velX(i,j)*(velX(i+1,j)+velX(i,j)) + ...
velY(i,j)*(velX(i,j+1)+velX(i-1,j)));
% 扩散项(中心差分)
diffTerm(i,j) = viscosity*( (velX(i+1,j)-2*velX(i,j)+velX(i-1,j))/stepX^2 + ...
(velX(i,j+1)-2*velX(i,j)+velX(i,j-1))/stepY^2 );
end
end
% 构建离散方程
matrixSize = numX * numY;
A = gallery('poisson', matrixSize);
b = -diffTerm(:) + fluxTerm(:);
newVelX = A\b;
newVelX = reshape(newVelX, [numX, numY]);
end
二、扩展应用
1. 耦合能量方程的加热通道流动
% 能量方程离散
function temperature = FVM_energy(temperature, velX, velY, density, specificHeat, thermalConductivity, stepX, stepY)
[numX, numY] = size(temperature);
for i = 2:numX-1
for j = 2:numY-1
% 对流项
convectiveTerm = density*specificHeat*(velX(i,j)*(temperature(i+1,j)+temperature(i,j)) + ...
velY(i,j)*(temperature(i,j+1)+temperature(i-1,j)));
% 扩散项
diffusiveTerm = thermalConductivity*( (temperature(i+1,j)-2*temperature(i,j)+temperature(i-1,j))/stepX^2 + ...
(temperature(i,j+1)-2*temperature(i,j)+temperature(i,j-1))/stepY^2 );
temperature(i,j) = temperature(i,j) + (convectiveTerm - diffusiveTerm)/(density*specificHeat);
end
end
end
2. 湍流模型集成(k-ε模型)
% 湍动能k方程
function turbKineticEnergy = FVM_turb_k(turbKineticEnergy, velX, velY, viscosity, density, stepX, stepY)
% 离散实现(需添加生成项与耗散项)
end
% 湍流耗散率ε方程
function dissipationRate = FVM_turb_epsilon(dissipationRate, turbKineticEnergy, velX, velY, viscosity, density, stepX, stepY)
% 离散实现
end
三、优化方法
- 矩阵预分配:
A = zeros(numX*numY, numX*numY);
b = zeros(numX*numY, 1);
- 并行计算:
parfor i = 2:numX-1
% 并行处理每个网格单元
end
- GPU加速:
gpuVelX = gpuArray(velX);
gpuVelY = gpuArray(velY);
% 在GPU上执行计算
四、验证案例
1. 平行板泊肃叶流动
- 理论解:
umax = 2 * viscosity * length * pressureDrop / height^2
- 验证方法:对比x=height/2截面速度分布
2. 二维方腔流
- Re=1000:验证自然对流特性
- 收敛标准:残差下降至1e-6
此方法通过模块化设计实现了复杂流动问题的数值求解,在实际应用中需要根据具体问题调整网格划分策略和松弛因子。