MATLAB程序初始化OpenFOAM颗粒位置

问题引入

在OpenFOAM的颗粒两相流求解器中,我们可以采用manualInjection的方式进行自定义颗粒的初始位置,这个命令十分方便,在CFDEM中也有类似的命令,不过CFDEM中的命令更加强大,我们不仅可以定义颗粒的初始位置,而且还可以定义颗粒的初始速度,唯一的缺点就是CFDEM学起来资料比较少。。。
anyway,这里我们介绍如何在OpenFOAM中实现这个操作。
其核心步骤是在cosntant文件夹下创建kinematicCloudPositions文件,其大致内容如下:
在这里插入图片描述
于是自定义粒子的位置的思路就非常简单,我们利用MATLAB创建上面的文件内容即可。

MATLAB编程

这里不对程序做解说,直接放在这里。

%% write by rqli 2023/8/10
%% MATLAB程序初始化OpenFOAM颗粒位置(颗粒位置为均匀分布)
clc;clear;format long

%% 各个方向颗粒的数目
NumXofP = 5;NumYofP = 5;NumZofP = 1;
%% 计算域参数
Lx = 0.278;Ly = 0.278;%这里是二维计算域,因此只有高度和宽度
Lz = 0.278;
%% 生成初始颗粒位置,每个点处速度的标准形式为(0.0,0.0,0.0)
position = zeros(NumXofP,NumYofP);
x = linspace(Lx/(2*NumXofP),Lx-Lx/(2*NumXofP),NumXofP);
y = linspace(Ly/(2*NumYofP),Ly-Ly/(2*NumYofP),NumYofP);
[X,Y] = meshgrid(x,y);
if NumZofP == 1
    postion_x = reshape(X,NumXofP*NumYofP*NumZofP,1);
    postion_y = reshape(Y,NumXofP*NumYofP*NumZofP,1);
    postion_z = zeros(NumXofP*NumYofP*NumZofP,1);
elseif NumZofP >1
    z = linspace(Lz/(2*NumZofP),Lz-Lz/(2*NumZofP),NumZofP); 
    X3d = [];
    Y3d = [];
    Z3d = [];
    for i = 1:length(z)
        X3d = [X3d;X];
        Y3d = [Y3d;Y];
        Z3d = [Z3d;z(i).*ones(NumXofP,NumYofP)];
    end
    postion_x = reshape(X3d,NumXofP*NumYofP*NumZofP,1);
    postion_y = reshape(Y3d,NumXofP*NumYofP*NumZofP,1);
    postion_z = reshape(Z3d,NumXofP*NumYofP*NumZofP,1);
    disp('done')
end

%% 将速度场转为txt文件
position_xyz = zeros(NumXofP*NumYofP*NumZofP,1);
position_xyz = num2str(position_xyz);
position_xyz = string(position_xyz);
for i = 1:NumXofP*NumYofP*NumZofP
    position_xyz(i) = strcat("(",num2str(postion_x(i))," ",...
        num2str(postion_y(i))," ",num2str(postion_z(i)),")");
end 
position_file = 'position';
writematrix(position_xyz,position_file);

二维粒子初始位置如下(采用scatter函数):
在这里插入图片描述
三维粒子位置排布如下(采用scatter3函数):
在这里插入图片描述

最后生成的文件如下:
在这里插入图片描述
我们把上面的坐标粘贴到kinematicCloudPositions文件里即可。

三维散点图的绘制参考资料

### OpenFOAM颗粒模拟的相关资源 在OpenFOAM中,对于涉及颗粒流动的研究和应用,存在多种方法和技术用于处理不同类型的颗粒流问题。针对颗粒两相流求解器,可以通过`manualInjection`方式自定义设置颗粒的初始条件[^2]。 为了更好地理解和掌握这些功能的应用,下面列举了一些关于OpenFOAM颗粒模拟的教学材料和指南: #### 官方文档与手册 官方发布的用户指南和程序员指南包含了大量有关配置、运行以及调试基于OpenFOAM平台构建的各种物理现象仿真的信息。特别是涉及到离散单元法(DEM)和其他形式的颗粒物质建模时,这些都是不可或缺的学习工具。 #### 社区论坛和支持网站 活跃的技术交流社区如Cfd-online论坛提供了一个良好的环境供研究人员分享经验并解决问题。许多高级话题讨论都围绕着具体的案例展开,比如如何调整参数以优化特定场景下的计算效率等问题。 #### 开源项目实例分析 通过研究开源贡献者们提交的实际工程项目,可以获得宝贵的第一手实践经验。例如,在某些公开可用的例子中可以看到怎样运用人口平衡模型(populationBalance model)[^3] 来描述气泡群体的行为特征;而在其他地方,则可能发现更多有关于固体物体间相互作用力场设定方面的细节说明。 #### 实践教程推荐 一些专注于工程数值仿真教育机构会定期发布高质量视频课程或在线讲座系列,它们通常由行业内的专家讲授,并配有详细的笔记和练习作业帮助学员巩固所学知识点。这类资源往往能够覆盖从基础入门到复杂课题探索等多个层次的内容需求。 ```python # Python脚本可用于生成所需的输入文件格式,辅助准备模拟所需的数据集。 import numpy as np def create_kinematic_cloud_positions_file(filename, positions): with open(filename, 'w') as f: f.write("(\n") for pos in positions: f.write(f"({pos[0]} {pos[1]} {pos[2]})\n") f.write(")\n") positions = [(i/10., i%10./10., (9-i)%10./10.) for i in range(10)] # 示例位置列表 create_kinematic_cloud_positions_file('kinematicCloudPositions', positions) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值