DEM-Engine与ParaView的使用

DEM-Engine与ParaView的使用 提示随着学习会不断加深里面的文章目录一、DEM-Engine二、DEM-Engine可以做什么三、它的核心能力为什么用它而不是普通软件代码怎么使用四、ParaView1.什么是ParaView2.怎么安装以及和DEM-Engine关系是什么3.可以做什么4. 怎么使用4. llinux下怎么导出视频一、DEM-EngineDEM-Engine 是一款专门用于离散元法Discrete Element Method, DEM的高性能数值模拟引擎核心是用来模拟颗粒 / 粉体 / 散体物料的运动、碰撞、受力与堆积行为。代码https://github.com/projectchrono/DEM-Engine这里面需要是c代码要重新编译可以把readme喂给豆包一点一点的安装吧要用GPU加速才行二、DEM-Engine可以做什么工业粉体 / 颗粒过程模拟 3D 打印清粉工艺优化就像你正在做的模拟 SLM/SLS 打印后零件内腔、流道里的粉末残留分布、流动和清粉过程吹气、振动、吹扫找到死角和清粉难点优化工艺参数。粉体输送与混合模拟料仓、螺旋输送机、混粉机里的颗粒流动、堵塞、偏析问题优化设备结构和工艺参数。 破碎 /研磨设备设计模拟矿石、物料在破碎机、球磨机里的破碎、磨损过程预测设备寿命和生产效率。岩土与地质工程模拟土壤、砂石、尾矿的堆积、滑坡、沉降过程分析边坡稳定性、地基承载力。模拟盾构机、掘进机刀具与岩土颗粒的相互作用优化刀具设计和施工参数。化工与制药行业模拟流化床、反应器里的颗粒流化、传热传质过程优化反应效率。模拟药片、胶囊的混合、压片、输送过程预测粉体流动性和成品质量。能源与矿业模拟煤矿、矿石在输送、装卸、筛分过程中的行为优化矿场设备和流程。模拟储料仓、料斗的卸料过程分析结拱、堵塞问题。三、它的核心能力为什么用它而不是普通软件精准的颗粒物理模型能模拟颗粒间的碰撞、摩擦、粘附、团聚以及颗粒与设备 零件壁面的相互作用甚至可以加入热传导、静电、湿颗粒含液体等复杂效应非常贴近真实粉体行为。大规模并行计算GPU/CPU像你现在处理的百万级颗粒数据DEM-Engine 通常支持 GPU加速能高效处理超大规模颗粒体系快速得到模拟结果这也是你需要 ParaView 配合做后处理的原因。与多物理场耦合可以和流体力学CFD、有限元FEM耦合比如模拟气固两相流、颗粒对设备的磨损和冲击实现 “粉体 流体 结构” 的多场协同分析。完整的前处理 - 求解 - 后处理流程支持颗粒生成、零件几何导入、参数设置、求解计算再输出时间序列点云数据也就是你现在用ParaView 打开的 CSV 文件方便后续做可视化和分析。代码怎么使用有两点需要注意DEM-Engine默认的以米为单位所以你要判断你的模型是以米为单位还是以毫米为单位如果以毫米为单位需要缩小一千倍drum_mesh-Scale(0.01f)drum_mesh-SetInitPos(make_float3(0, 0, 0));这里面的三个点代表了你模型的初始中心点放在了0,0,0就是模型的中心点粒子不要太小尽量不要低于0.1mm怎么判断模型是以米为单位还是以毫米为单位如果是几十上百基本上是以毫米为单位如果0.几基本上就是以米为单位// Copyright (c) 2021, SBEL GPU Development Team// Copyright (c) 2021, University of Wisconsin - Madison//// SPDX-License-Identifier: BSD-3-Clause#includecore/ApiVersion.h#includecore/utils/ThreadManager.h#includeDEM/API.h#includeDEM/HostSideHelpers.hpp#includeDEM/utils/Samplers.hpp#includecstdio#includechrono#includefilesystem#includerandom#includeiostreamusingnamespacedeme;usingnamespacestd::filesystem;intmain(){// 仿真全局参数适配金属颗粒 floatdrum_rot_vel0.05;// 滚筒旋转角速度 rad/s// 3D打印金属颗粒常见尺寸0.05-0.15mm这里放大为便于仿真单位mfloatparticle_rad_min0.0001;// 最小金属颗粒半径 50μmfloatparticle_rad_max0.0001;// 最大金属颗粒半径 150μmfloatdrum_scale1.0;DEMSolver DEMSim;DEMSim.SetVerbosity(ERROR);DEMSim.SetOutputFormat(CSV);DEMSim.SetOutputContent({ABSV});// 增加力和扭矩输出便于分析金属颗粒受力DEMSim.SetMeshOutputFormat(VTK);path out_dircurrent_path();out_dir/DemoOutput_RotatingDrum_MetalParticle;create_directory(out_dir);DEMSim.SetErrorOutVelocity(100000.0);DEMSim.SetErrorOutAvgContacts(500);// 材料定义金属颗粒滚筒特性 // 滚筒材料不锈钢常用3D打印设备滚筒材质automat_type_drumDEMSim.LoadMaterial({{E,2e6},// 降低10000倍{nu,0.3},{CoR,0.6},{mu,0.4},{Crr,0.02}});automat_type_metalDEMSim.LoadMaterial({{E,1e6},// 降低10000倍{nu,0.34},{CoR,0.55},{mu,0.45},{Crr,0.02}});// 仿真域 时间步 doubleworld_size0.4;DEMSim.InstructBoxDomainDimension({-world_size/2.,world_size/2.},{-world_size/2.,world_size/2.},{0,0.5});DEMSim.InstructBoxDomainBoundingBC(top_open,mat_type_drum);// 金属颗粒尺寸更小需匹配更小的时间步保证稳定性floatstep_size1e-7;// 加载 网格滚筒 autodrum_meshDEMSim.AddWavefrontMeshObject((GET_DATA_PATH()/mesh/drum.obj).string(),mat_type_drum);if(!drum_mesh){std::cerrFATAL: 滚筒网格加载失败std::endl;return-1;}std::cout滚筒网格三角面数量: drum_mesh-GetNumTriangles()std::endl;drum_mesh-SetInitPos(make_float3(0,0,0));drum_mesh-Scale(0.001f);drum_mesh-SetFamily(1);DEMSim.SetFamilyPrescribedAngVel(1,std::to_string(drum_rot_vel),0,0);// 生成3D打印金属颗粒 std::vectorstd::shared_ptrDEMClumpTemplatetemplates_metal;floatrad_step(particle_rad_max-particle_rad_min)/3;for(inti0;i4;i){floatrparticle_rad_mini*rad_step;std::coutDEBUG: Loading metal particle type i, r r mstd::endl;// 金属颗粒密度Ti6Al4V密度4430 kg/m³不锈钢7850铝合金2700floatdensity4430.0;floatmassdensity*(4.0/3.0*PI*r*r*r);templates_metal.push_back(DEMSim.LoadSphereType(mass,r,mat_type_metal));}std::coutDEBUG: All metal particle templates loadedstd::endl;std::random_device rd;std::mt19937gen(rd());std::uniform_int_distributiondist(0,templates_metal.size()-1);// 金属颗粒采样间距保证不重叠PDSamplersampler(2.2*particle_rad_max);// 适配小颗粒的采样区域保证颗粒数量合理floatsample_halfwidth0.003;// 总宽度 7cm 7.4cmfloatsample_height0.003;float3 sample_centermake_float3(-0.22,0,0);std::coutDEBUG: Starting sampling metal particles...std::endl;autoinput_xyzsampler.SampleBox(sample_center,make_float3(sample_halfwidth,sample_halfwidth,sample_height));std::coutDEBUG: Sampling done, got input_xyz.size() metal particlesstd::endl;// 关键限制粒子数量避免超出内存上限// 限制到 3000 个兼顾视觉效果 内存 不崩溃if(input_xyz.size()300){input_xyz.resize(100);}std::vectorstd::shared_ptrDEMClumpTemplatetemplate_to_use(input_xyz.size());for(unsignedinti0;iinput_xyz.size();i){template_to_use[i]templates_metal[dist(gen)];}DEMSim.AddClumps(template_to_use,input_xyz);std::cout生成金属颗粒总数: input_xyz.size()std::endl;// 仿真全局设置 DEMSim.SetInitTimeStep(step_size);DEMSim.SetMaxVelocity(5.0);// 金属颗粒密度大速度限制更低更稳定DEMSim.SetGravitationalAcceleration(make_float3(0,0,-9.81));std::coutDEBUG: Initializing DEM solver...std::endl;DEMSim.Initialize();std::coutDEBUG: DEM solver initialized successfully!std::endl;// 仿真输出控制 floatsim_time3.0;// 适当延长仿真时间观察金属颗粒运动特性unsignedintfps10;floatframe_time1.0/fps;unsignedintcurrframe0;std::cout输出帧率: fps FPSstd::endl;for(floatt0;tsim_time;tframe_time){std::cout当前帧: currframestd::endl;charfilename[100],meshfilename[100];sprintf(filename,DEMdemo_metal_particle_%04d.csv,currframe);sprintf(meshfilename,DEMdemo_drum_mesh_%04d.vtk,currframe);DEMSim.WriteSphereFile(out_dir/filename);DEMSim.WriteMeshFile(out_dir/meshfilename);currframe;std::cout执行动力学...std::endl;DEMSim.DoDynamicsThenSync(frame_time);DEMSim.ShowThreadCollaborationStats();}std::coutstd::endl;std::cout3D打印金属颗粒旋转滚筒仿真完成std::endl;std::cout颗粒类型Ti6Al4V钛合金可替换为其他金属std::endl;std::cout颗粒尺寸50-150μm3D打印常用范围std::endl;std::coutstd::endl;return0;}粒子生成区域// 适配小颗粒的采样区域保证颗粒数量合理floatsample_halfwidth0.05;// 总宽度 7cm 7.4cmfloatsample_height0.02;// 薄一点不堆float3 sample_centermake_float3(-6,0,0);std::coutDEBUG: Starting sampling metal particles...std::endl;autoinput_xyzsampler.SampleBox(sample_center,make_float3(sample_halfwidth,sample_halfwidth,sample_height));EM 引擎不管模型内部是不是空的只要粒子初始位置与壁面碰撞体重叠就会判定为穿透产生巨大的排斥力直接导致速度溢出报错可以先导入第一轮的.csv和模型看看初始位置有没有放错DSampler 的对称逻辑是以采样中心点为中心左右对称撒点你把中心直接挪到了 -0.22那它只会在 -0.22 左右小范围对称不会跑到 0.22 去生成另一堆。时间步time step就是仿真里「每次更新一次世界状态」所前进的时间长度。比如你设 step_size 1e-7意思是 仿真每算一次动力学时间就往前走 0.0000001 秒DEMSim.SetGravitationalAcceleration(make_float3(0, -9.81, 0));这个代表了设置重力x,y,z四、ParaView1.什么是ParaViewParaView 是一款开源、跨平台的科学数据可视化与分析工具由美国洛斯阿拉莫斯国家实验室开发专门用来处理大规模数值模拟数据2.怎么安装以及和DEM-Engine关系是什么在安装DEM-Engine的时候会把readme喂给豆包同样你让豆包给出安装流程一步一步的安装就行千万要注意要在本机上安装不要在远程ssh上进行安装会出很多错误DEM-Engine做颗粒模拟 → 导出CSV/点云数据 → ParaView可视化分析导出结果DEM-Engine 负责 “算数据”告诉你每个颗粒的位置、速度、受力 ParaView 负责“看懂数据”把枯燥的数字变成能直观看到的 3D 模型和动画帮你判断清粉工艺哪里有问题。3.可以做什么点云 / 颗粒数据可视化就是你现在正在做的把 DEM-Engine 输出的颗粒数据转换成 3D点云模型还能调整点大小、颜色、透明度甚至播放随时间变化的颗粒运动动画。数据后处理与分析你可以直接在 ParaView里对数据做筛选、统计和切片比如筛选出特定区域的颗粒计算残留量给颗粒按速度、大小上色一眼看出分布规律用透明度穿透观察零件内部的粉末死角解决 3D 打印清粉问题4. 怎么使用选择file,打开 选中你的csv文件打开点击apply,会看到下面的情况看窗口最顶部的菜单栏点击 Filters → 找到 Alphabetical → 往下翻找到 Table To Points点击它。现在你在 TableToPoints1 的属性面板里按下面的方式操作找到 X Column 这一行它的右边有个下拉箭头 ▼点一下在弹出的列表里选择 X你的 CSV 里的 X 坐标列。 找到 Y Column 这一行点下拉箭头选择 Y。 找到 Z Column 这一行点下拉箭头选择 Z。注意现在这三个列都是你 CSV 里的 X/Y/Z不是之前的 Points 了设置要对应上。确认这三行都设置好了再点一次左上角的 Apply 按钮。小眼睛别忘了点设置一下最大的帧数点一下play就可以播放了4. llinux下怎么导出视频点击顶部菜单栏 File → Save Animation。Linux 版 ParaView 里非常常见的情况导出 MP4 视频的功能需要额外的 FFmpeg 支持而你的系统里没装 / 没识别到所以下拉框里只有 PNG 图片选项。安装 FFmpeg打开终端根据你的发行版执行命令Ubuntu/Debiansudo apt updatesudo apt install ffmpeg安装好后只有.ogv先导出 .ogv再用 FFmpeg 转成 MP4运行ffmpeg-i你的视频文件.ogv-c:vlibx264-pix_fmtyuv420p output.mp4生成的 output.mp4 就是通用格式Windows/Mac/ 汇报都能直接打开。