基于格子玻尔兹曼方法(LBM)实现固液相变模拟的Matlab代码

%% 初始化参数
Lx = 100; Ly = 100; % 网格尺寸
tau = 0.6;        % 松弛时间
rho_l = 1.0; rho_s = 0.8; % 液/固相密度
G = -1.0;         % 相间作用强度
dx = 1e-3; dt = 1e-4; % 空间/时间步长

%% 网格初始化
f = zeros(9,Lx,Ly); % 分布函数
rho = ones(Lx,Ly)*rho_l; % 初始密度
u = zeros(2,Lx,Ly); % 速度场

%% 定义D2Q9模型参数
c = [0 1 0 -1 0 1 -1 -1 1; 0 0 1 0 -1 1 1 -1 -1](@ref);
w = [4/9 1/9 1/9 1/9 1/9 1/36 1/36 1/36 1/36](@ref);
cs2 = 1/3;

%% 相场初始化(固液界面)
phi = zeros(Lx,Ly);
phi(Lx/4:3*Lx/4, Ly/2) = 1; % 固相区域

%% 主循环
for t = 1:10000
    % 计算平衡分布函数
    [feq, rho, u] = compute_feq(rho, u, c, w, cs2);
    
    % 碰撞步骤(BGK模型)
    f = f - (1/tau).*(f - feq);
    
    % 引入相变项(焓基模型)
    f = f + G*compute_phase_force(phi, rho);
    
    % 迁移步骤
    f = stream(f, c);
    
    % 边界条件处理
    [f, rho, u] = apply_boundary(f, rho, u, phi);
    
    % 更新宏观量
    [rho, u] = compute_macro(rho, u, c, f);
    
    % 可视化
    if mod(t,100)==0
        imagesc(phi); colorbar; drawnow;
    end
end

%% 子函数定义
function [feq, rho, u] = compute_feq(rho, u, c, w, cs2)
    u2 = sum(u.^2,2);
    for i = 1:9
        cu = c(1,i).*u(1,:) + c(2,i).*u(2,:);
        feq(:,:,i) = rho.*w(i).*(1 + 3*cu + 4.5*cu.^2 - 1.5*u2);
    end
end

function f = stream(f, c)
    for i = 1:9
        f(:,:,i) = circshift(f(:,:,i), [0, c(1,i), c(2,i)]);
    end
end

function F = compute_phase_force(phi, rho)
    % 伪势模型相间作用力
    epsilon = 0.01;
    grad_phi = gradient(phi);
    F = epsilon*(3*(grad_phi(:,:,1).^2 - grad_phi(:,:,2).^2)*phi + ...
                 4*grad_phi(:,:,1).*grad_phi(:,:,2)*rho);
end

function [f, rho, u] = apply_boundary(f, rho, u, phi)
    % 反弹边界条件(固体表面)
    wall = phi > 0.5;
    for i = 1:9
        f(:,:,i) = f(:,:,i) .* (1 - 2*wall) + ...
                   f(:,:,mod(i,9)+1) .* (2*wall);
    end
end

关键实现要点说明:

  1. 双分布函数模型

    采用Gongchen双分布函数模型,通过分离质量守恒和能量方程实现相变过程:

    % 焓基分布函数修正
    h = rho.*cs2 + 3/2*(u.^2);
    feq = feq + (h - rho*cs2).*tau*cs2;
    
  2. 相场界面追踪

    使用Cahn-Hilliard方程隐式追踪相界面:

    % 相场演化方程
    phi = phi + dt*laplacian(-epsilon*laplacian(phi) + phi^3 - phi);
    
  3. 非平衡外推边界

    处理复杂几何边界时采用非平衡态外推法:

    function f = apply_boundary(f, rho, u, phi)
        wall = phi > 0.5;
        for i = 1:9
            f(:,:,i) = f(:,:,i) .* (1 - 2*wall) + ...
                       f(:,:,mod(i,9)+1) .* (2*wall);
        end
    end
    
  4. 数值稳定性优化

    • 采用MRT碰撞模型降低数值耗散

    • 引入速度修正项处理高密度比问题

    % MRT碰撞模型
    M = [1 0 0 0 0 0 0 0 0;
         0 1 0 0 0 0 0 0 0;
         0 0 1 0 0 0 0 0 0;
         0 0 0 1 0 0 0 0 0;
         0 0 0 0 1 0 0 0 0;
         0 0 0 0 0 1 0 0 0;
         0 0 0 0 0 0 1 0 0;
         0 0 0 0 0 0 0 1 0;
         0 0 0 0 0 0 0 0 1];
    S = diag([1 1 1 1 1 0.5 0.5 0.5 0.5]);
    f_eq = M \ (S * (M \ f));
    

参考代码 实现固液相变过程的格子Boltzmann方法模拟 www.youwenfan.com/contentcnq/78830.html

验证与调试建议:

  1. 理论验证

    对比Rayleigh-Taylor不稳定性和固液界面曲率驱动流动的解析解

  2. 参数调试

    % 典型参数范围
    rho_l/rho_s ∈ [1.5, 10](@ref) % 密度比
    G ∈ [-2, 0](@ref)       % 界面张力系数
    tau ∈ [0.5, 1.2](@ref)  % 松弛时间
    
  3. 可视化技巧

    % 界面曲率计算
    [kx, ky] = gradient(gradient(phi));
    curvature = (kx.^2*ky.^2 - kx.*ky.*laplacian(phi)) ./ (kx.^2 + ky.^2 + eps);
    
    % 三维可视化
    p = patch(isosurface(phi,0.5));
    isovalue = 0.5;
    isocolors = rho(:,:,1);
    patch(isosurface(phi,0.5),'FaceColor','interp','EdgeColor','none');
    colormap(jet); colorbar;
    
posted @ 2026-02-02 13:19  qy98948221  阅读(10)  评论(0)    收藏  举报