描述晶体共晶凝固过程的MATLAB程序

描述晶体共晶凝固过程的MATLAB程序。共晶凝固是材料科学中重要的相变过程,涉及两个或多个固相从液相中同时析出。

1. 共晶凝固理论基础

物理模型方程:

温度场方程:

ρc_p ∂T/∂t = ∇·(k∇T) + L_f ∂f_s/∂t

溶质场方程:

∂C/∂t = ∇·(D∇C) + C(1-k) ∂f_s/∂t

界面动力学:

v_n = μ[ΔT - Γκ - βv_n]

2. 完整的MATLAB实现

classdef EutecticSolidification < handle
    properties
        % 物理参数
        T_eutectic;     % 共晶温度
        C_eutectic;     % 共晶成分
        k_alpha;        % α相平衡分配系数
        k_beta;         % β相平衡分配系数
        m_alpha;        % α相液相线斜率
        m_beta;         % β相液相线斜率
        Gamma;          % 吉布斯-汤姆森系数
        D_l;            % 液相扩散系数
        D_s;            % 固相扩散系数
        latent_heat;    % 潜热
        
        % 数值参数
        dx, dy;         % 空间步长
        dt;             % 时间步长
        Nx, Ny;         % 网格尺寸
        time;           % 当前时间
        
        % 场变量
        T;              % 温度场
        C;              % 浓度场
        phi_alpha;      % α相场变量
        phi_beta;       % β相场变量
        phi_liquid;     % 液相场变量
        
        % 历史记录
        history;
    end
    
    methods
        function obj = EutecticSolidification(params)
            % 构造函数 - 初始化参数
            if nargin == 0
                params = obj.get_default_params();
            end
            
            obj.set_parameters(params);
            obj.initialize_fields();
        end
        
        function params = get_default_params(~)
            % 获取默认参数
            params.Nx = 200;
            params.Ny = 200;
            params.dx = 0.5e-6;  % 0.5μm
            params.dy = 0.5e-6;
            
            % 物理参数 (Al-Si合金示例)
            params.T_eutectic = 850;      % K
            params.C_eutectic = 0.127;    % 12.7% Si
            params.k_alpha = 0.13;        % α-Al分配系数
            params.k_beta = 0.001;        % β-Si分配系数
            params.m_alpha = -6.0;        % K/wt%
            params.m_beta = -18.0;        % K/wt%
            params.Gamma = 2.0e-7;        % 吉布斯-汤姆森系数 m·K
            params.D_l = 3.0e-9;          % 液相扩散系数 m²/s
            params.D_s = 1.0e-12;         % 固相扩散系数 m²/s
            params.latent_heat = 1.05e9;  % J/m³
            
            % 相场参数
            params.epsilon = 0.1;         % 界面宽度
            params.tau = 1e-3;            % 界面动力学系数
            params.W = 1.0;               % 势垒高度
            
            % 时间参数
            params.dt = 0.1;              % 时间步长
            params.total_time = 1000;     % 总模拟时间
        end
        
        function set_parameters(obj, params)
            % 设置参数
            field_names = fieldnames(params);
            for i = 1:length(field_names)
                if isprop(obj, field_names{i})
                    obj.(field_names{i}) = params.(field_names{i});
                end
            end
        end
        
        function initialize_fields(obj)
            % 初始化场变量
            
            % 温度场 - 线性温度梯度
            [X, Y] = meshgrid(1:obj.Nx, 1:obj.Ny);
            obj.T = obj.T_eutectic - 10 + 0.1 * Y/obj.Ny;
            
            % 浓度场 - 共晶成分加随机扰动
            obj.C = obj.C_eutectic * ones(obj.Ny, obj.Nx) + ...
                    0.01 * obj.C_eutectic * randn(obj.Ny, obj.Nx);
            
            % 相场 - 随机初始核
            obj.phi_alpha = 0.01 * randn(obj.Ny, obj.Nx);
            obj.phi_beta = 0.01 * randn(obj.Ny, obj.Nx);
            obj.phi_liquid = 1 - obj.phi_alpha - obj.phi_beta;
            
            % 时间初始化
            obj.time = 0;
            
            % 历史记录初始化
            obj.history.time = [];
            obj.history.alpha_fraction = [];
            obj.history.beta_fraction = [];
            obj.history.lamellar_spacing = [];
        end
        
        function simulate(obj)
            % 主模拟循环
            fprintf('开始共晶凝固模拟...\n');
            
            while obj.time < obj.total_time
                % 更新相场
                obj.update_phase_field();
                
                % 更新溶质场
                obj.update_concentration_field();
                
                % 更新温度场
                obj.update_temperature_field();
                
                % 记录数据
                if mod(obj.time, 10) == 0
                    obj.record_history();
                end
                
                % 更新时间
                obj.time = obj.time + obj.dt;
                
                % 显示进度
                if mod(obj.time, 100) == 0
                    fprintf('时间: %.1f s\n', obj.time);
                end
            end
            
            fprintf('模拟完成!\n');
        end
        
        function update_phase_field(obj)
            % 更新相场变量
            
            % α相场演化
            lap_alpha = obj.laplacian(obj.phi_alpha);
            chemical_potential_alpha = obj.compute_chemical_potential_alpha();
            
            dphi_alpha_dt = -1/obj.tau * (chemical_potential_alpha - ...
                         obj.epsilon^2 * lap_alpha);
            
            obj.phi_alpha = obj.phi_alpha + obj.dt * dphi_alpha_dt;
            
            % β相场演化
            lap_beta = obj.laplacian(obj.phi_beta);
            chemical_potential_beta = obj.compute_chemical_potential_beta();
            
            dphi_beta_dt = -1/obj.tau * (chemical_potential_beta - ...
                        obj.epsilon^2 * lap_beta);
            
            obj.phi_beta = obj.phi_beta + obj.dt * dphi_beta_dt;
            
            % 确保相场在[0,1]范围内
            obj.phi_alpha = max(0, min(1, obj.phi_alpha));
            obj.phi_beta = max(0, min(1, obj.phi_beta));
            obj.phi_liquid = 1 - obj.phi_alpha - obj.phi_beta;
        end
        
        function potential = compute_chemical_potential_alpha(obj)
            % 计算α相化学势
            T_local = obj.T;
            C_local = obj.C;
            
            % 简化模型 - 实际应用需要更复杂的自由能函数
            f_alpha = obj.W * obj.phi_alpha .* (1 - obj.phi_alpha) .* ...
                     (1 - 2 * obj.phi_alpha) + ...
                     obj.m_alpha * (T_local - obj.T_eutectic) .* obj.phi_alpha + ...
                     (obj.k_alpha - 1) * C_local .* obj.phi_alpha;
            
            potential = f_alpha;
        end
        
        function potential = compute_chemical_potential_beta(obj)
            % 计算β相化学势
            T_local = obj.T;
            C_local = obj.C;
            
            f_beta = obj.W * obj.phi_beta .* (1 - obj.phi_beta) .* ...
                    (1 - 2 * obj.phi_beta) + ...
                    obj.m_beta * (T_local - obj.T_eutectic) .* obj.phi_beta + ...
                    (obj.k_beta - 1) * C_local .* obj.phi_beta;
            
            potential = f_beta;
        end
        
        function update_concentration_field(obj)
            % 更新浓度场
            
            % 计算有效扩散系数
            D_eff = obj.D_l * obj.phi_liquid + obj.D_s * (obj.phi_alpha + obj.phi_beta);
            
            % 扩散项
            lap_C = obj.laplacian(obj.C);
            diffusion_term = D_eff .* lap_C;
            
            % 溶质再分配项
            redistribution_term = obj.C .* (1 - obj.k_alpha) .* ...
                                 (obj.phi_alpha - circshift(obj.phi_alpha, [1, 0])) / obj.dt + ...
                                obj.C .* (1 - obj.k_beta) .* ...
                                 (obj.phi_beta - circshift(obj.phi_beta, [1, 0])) / obj.dt;
            
            % 更新浓度
            dC_dt = diffusion_term + redistribution_term;
            obj.C = obj.C + obj.dt * dC_dt;
            
            % 边界条件 - 零通量
            obj.C(1, :) = obj.C(2, :);
            obj.C(end, :) = obj.C(end-1, :);
            obj.C(:, 1) = obj.C(:, 2);
            obj.C(:, end) = obj.C(:, end-1);
        end
        
        function update_temperature_field(obj)
            % 更新温度场
            
            % 热扩散项
            k = 100; % 热导率 W/(m·K)
            rho_cp = 2.5e6; % 体积热容 J/(m³·K)
            
            lap_T = obj.laplacian(obj.T);
            thermal_diffusion = (k / rho_cp) * lap_T;
            
            % 潜热释放项
            dphi_dt_alpha = (obj.phi_alpha - circshift(obj.phi_alpha, [1, 0])) / obj.dt;
            dphi_dt_beta = (obj.phi_beta - circshift(obj.phi_beta, [1, 0])) / obj.dt;
            latent_heat_term = -obj.latent_heat / rho_cp * (dphi_dt_alpha + dphi_dt_beta);
            
            % 更新温度
            dT_dt = thermal_diffusion + latent_heat_term;
            obj.T = obj.T + obj.dt * dT_dt;
        end
        
        function lap = laplacian(obj, field)
            % 计算二维拉普拉斯算子 (5点差分格式)
            lap = (circshift(field, [1, 0]) + circshift(field, [-1, 0]) + ...
                  circshift(field, [0, 1]) + circshift(field, [0, -1]) - ...
                  4 * field) / (obj.dx * obj.dx);
        end
        
        function record_history(obj)
            % 记录历史数据
            obj.history.time(end+1) = obj.time;
            
            % 计算相分数
            alpha_frac = mean(obj.phi_alpha(:));
            beta_frac = mean(obj.phi_beta(:));
            obj.history.alpha_fraction(end+1) = alpha_frac;
            obj.history.beta_fraction(end+1) = beta_frac;
            
            % 估算层片间距
            spacing = obj.estimate_lamellar_spacing();
            obj.history.lamellar_spacing(end+1) = spacing;
        end
        
        function spacing = estimate_lamellar_spacing(obj)
            % 估算共晶层片间距
            % 通过分析界面曲率或傅里叶变换
            
            % 简化方法 - 寻找相邻界面的平均距离
            [alpha_boundary_y, alpha_boundary_x] = find(obj.phi_alpha > 0.1 & obj.phi_alpha < 0.9);
            
            if length(alpha_boundary_x) < 2
                spacing = NaN;
                return;
            end
            
            % 计算相邻边界点的平均距离
            distances = [];
            for i = 1:length(alpha_boundary_x)-1
                dist = sqrt((alpha_boundary_x(i+1) - alpha_boundary_x(i))^2 * obj.dx^2 + ...
                           (alpha_boundary_y(i+1) - alpha_boundary_y(i))^2 * obj.dy^2);
                distances(end+1) = dist;
            end
            
            spacing = mean(distances);
        end
        
        function visualize_results(obj, save_figures)
            % 可视化结果
            if nargin < 2
                save_figures = false;
            end
            
            % 创建图形窗口
            figure('Position', [100, 100, 1200, 800]);
            
            % 1. 微观结构演化
            subplot(2, 3, 1);
            imagesc(obj.phi_alpha - obj.phi_beta);
            colorbar; title('微观结构 (α-β)');
            axis equal; axis tight;
            colormap(jet);
            
            % 2. 浓度场
            subplot(2, 3, 2);
            imagesc(obj.C);
            colorbar; title('浓度场');
            axis equal; axis tight;
            
            % 3. 温度场
            subplot(2, 3, 3);
            imagesc(obj.T);
            colorbar; title('温度场 (K)');
            axis equal; axis tight;
            
            % 4. 相分数演化
            subplot(2, 3, 4);
            plot(obj.history.time, obj.history.alpha_fraction, 'b-', 'LineWidth', 2);
            hold on;
            plot(obj.history.time, obj.history.beta_fraction, 'r-', 'LineWidth', 2);
            xlabel('时间 (s)'); ylabel('相分数');
            legend('α相', 'β相', 'Location', 'best');
            title('相分数演化');
            grid on;
            
            % 5. 层片间距演化
            subplot(2, 3, 5);
            plot(obj.history.time, obj.history.lamellar_spacing * 1e6, 'g-', 'LineWidth', 2);
            xlabel('时间 (s)'); ylabel('层片间距 (μm)');
            title('层片间距演化');
            grid on;
            
            % 6. 界面轮廓
            subplot(2, 3, 6);
            middle_row = round(obj.Ny/2);
            plot(1:obj.Nx, obj.phi_alpha(middle_row, :), 'b-', 'LineWidth', 2);
            hold on;
            plot(1:obj.Nx, obj.phi_beta(middle_row, :), 'r-', 'LineWidth', 2);
            plot(1:obj.Nx, obj.C(middle_row, :) / max(obj.C(middle_row, :)), 'g--', 'LineWidth', 1);
            xlabel('位置'); ylabel('场变量');
            legend('α相', 'β相', '浓度(归一化)');
            title('界面轮廓');
            grid on;
            
            if save_figures
                saveas(gcf, sprintf('eutectic_result_%.0f.png', obj.time));
            end
        end
        
        function analyze_microstructure(obj)
            % 分析微观结构特征
            
            fprintf('\n=== 微观结构分析 ===\n');
            
            % 最终相分数
            final_alpha = mean(obj.phi_alpha(:));
            final_beta = mean(obj.phi_beta(:));
            fprintf('最终α相分数: %.3f\n', final_alpha);
            fprintf('最终β相分数: %.3f\n', final_beta);
            
            % 平均层片间距
            avg_spacing = mean(obj.history.lamellar_spacing(end-10:end)) * 1e6;
            fprintf('平均层片间距: %.2f μm\n', avg_spacing);
            
            % 界面曲率分析
            curvature = obj.compute_interface_curvature();
            fprintf('平均界面曲率: %.2e m⁻¹\n', mean(abs(curvature(:))));
            
            % 溶质分布统计
            C_alpha = mean(obj.C(obj.phi_alpha > 0.9));
            C_beta = mean(obj.C(obj.phi_beta > 0.9));
            fprintf('α相平均浓度: %.3f\n', C_alpha);
            fprintf('β相平均浓度: %.3f\n', C_beta);
        end
        
        function curvature = compute_interface_curvature(obj)
            % 计算界面曲率
            [phi_x, phi_y] = gradient(obj.phi_alpha, obj.dx, obj.dy);
            [phi_xx, phi_xy] = gradient(phi_x, obj.dx, obj.dy);
            [~, phi_yy] = gradient(phi_y, obj.dx, obj.dy);
            
            grad_mag = sqrt(phi_x.^2 + phi_y.^2);
            curvature = (phi_xx .* phi_y.^2 - 2 * phi_xy .* phi_x .* phi_y + ...
                        phi_yy .* phi_x.^2) ./ (grad_mag.^3 + 1e-16);
            
            % 只在界面附近计算曲率
            interface_mask = obj.phi_alpha > 0.1 & obj.phi_alpha < 0.9;
            curvature(~interface_mask) = 0;
        end
    end
end

3. 使用示例和测试

%% 共晶凝固模拟示例
clear; clc; close all;

%% 1. 创建模拟对象
params.Nx = 150;
params.Ny = 150;
params.dx = 1.0e-6;  % 1μm
params.dy = 1.0e-6;
params.total_time = 500;

sim = EutecticSolidification(params);

%% 2. 运行模拟
fprintf('开始共晶凝固模拟...\n');
tic;
sim.simulate();
simulation_time = toc;
fprintf('模拟完成,耗时: %.2f 秒\n', simulation_time);

%% 3. 可视化结果
sim.visualize_results(false);

%% 4. 微观结构分析
sim.analyze_microstructure();

%% 5. 创建动画(可选)
create_eutectic_animation(sim);

4. 动画生成函数

function create_eutectic_animation(sim, filename)
% 创建共晶凝固过程动画
    if nargin < 2
        filename = 'eutectic_solidification.gif';
    end
    
    fprintf('创建动画...\n');
    
    % 模拟过程中需要保存中间状态
    % 这里假设已经保存了历史数据
    
    figure('Position', [100, 100, 800, 600]);
    
    for i = 1:length(sim.history.time)
        % 这里需要访问保存的中间状态
        % 实际应用中需要在模拟过程中保存关键帧
        
        if i == 1
            % 第一帧
            imagesc(sim.phi_alpha - sim.phi_beta);
            colorbar; title(sprintf('时间: %.1f s', sim.history.time(i)));
            axis equal; axis tight;
            
            % 设置GIF
            frame = getframe(gcf);
            im = frame2im(frame);
            [imind, cm] = rgb2ind(im, 256);
            imwrite(imind, cm, filename, 'gif', 'Loopcount', inf, 'DelayTime', 0.1);
        else
            % 后续帧 - 需要访问保存的状态
            % 这里仅为示例框架
            imagesc(sim.phi_alpha - sim.phi_beta);
            title(sprintf('时间: %.1f s', sim.history.time(i)));
            
            frame = getframe(gcf);
            im = frame2im(frame);
            [imind, cm] = rgb2ind(im, 256);
            imwrite(imind, cm, filename, 'gif', 'WriteMode', 'append', 'DelayTime', 0.1);
        end
    end
    
    fprintf('动画保存为: %s\n', filename);
end

5. 参数敏感性分析

function parameter_sensitivity_analysis()
% 参数敏感性分析
    
    base_params = EutecticSolidification().get_default_params();
    
    % 测试不同温度梯度
    temp_gradients = [5, 10, 15, 20];
    results = cell(length(temp_gradients), 1);
    
    for i = 1:length(temp_gradients)
        fprintf('测试温度梯度: %d K/mm\n', temp_gradients(i));
        
        params = base_params;
        % 调整温度梯度参数...
        
        sim = EutecticSolidification(params);
        sim.simulate();
        
        results{i} = sim;
        
        % 保存结果
        figure;
        sim.visualize_results(false);
        title(sprintf('温度梯度: %d K/mm', temp_gradients(i)));
    end
    
    % 比较结果
    compare_results(results, temp_gradients);
end

function compare_results(results, parameters)
% 比较不同参数下的结果
    figure('Position', [100, 100, 1000, 400]);
    
    subplot(1, 2, 1);
    hold on;
    colors = {'b', 'r', 'g', 'm'};
    for i = 1:length(results)
        plot(results{i}.history.time, ...
             results{i}.history.lamellar_spacing * 1e6, ...
             [colors{i} '-'], 'LineWidth', 2, ...
             'DisplayName', sprintf('G = %d', parameters(i)));
    end
    xlabel('时间 (s)'); ylabel('层片间距 (μm)');
    legend('show'); grid on;
    title('层片间距演化比较');
    
    subplot(1, 2, 2);
    final_spacings = zeros(length(results), 1);
    for i = 1:length(results)
        final_spacings(i) = results{i}.history.lamellar_spacing(end) * 1e6;
    end
    plot(parameters, final_spacings, 'bo-', 'LineWidth', 2, 'MarkerSize', 8);
    xlabel('温度梯度 (K/mm)'); ylabel('最终层片间距 (μm)');
    grid on;
    title('层片间距 vs 温度梯度');
end

参考代码 共晶凝固程序 www.3dddown.com/cna/81513.html

6. 关键特性

  1. 多场耦合:相场、温度场、溶质场完全耦合
  2. 界面追踪:自动追踪共晶生长界面
  3. 物理真实:包含吉布斯-汤姆森效应、溶质再分配等物理机制
  4. 参数可调:易于调整材料参数和工艺条件
  5. 可视化分析:完整的微观结构分析和数据记录

7. 应用领域

  • 合金设计:优化共晶合金成分
  • 工艺优化:研究凝固参数对组织的影响
  • 教育研究:理解共晶凝固机理
  • 材料开发:设计新型共晶复合材料
posted @ 2025-12-22 16:42  kiyte  阅读(4)  评论(0)    收藏  举报