✨ 长期致力于格子玻尔兹曼方法、浸入移动边界法、离散单元法、计算流体动力学、程序设计、非球形颗粒系统研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
✅如需沟通交流,点击《获取方式》
(1)凸多边形分解与快速碰撞检测算法:
针对任意形状多边形颗粒,提出一种自适应凸分解方法PolySplit,将凹多边形颗粒分割为多个凸子形状,同时记录子形状之间的相对位置关系,便于整体运动计算。碰撞检测采用改进的GJK算法,结合空间哈希网格粗筛选,仅对邻近网格内的颗粒对进行精细检测。为解决高速运动下的穿透问题,引入连续碰撞检测CCD:在每一个DEM时间步内,计算颗粒从t到t+dt的运动轨迹,检测轨迹与壁面或其他颗粒的相交时刻,精确回滚至碰撞点。设计了一种接触力模型,考虑法向弹塑性变形和切向库仑摩擦,同时将滚动阻力矩纳入计算。在颗粒流模拟中,该算法处理10000个随机多边形颗粒的碰撞检测耗时仅0.23秒每步,穿透率低于0.01%。
(2)浸入边界LBM耦合的力计算与体积分数优化:
流体求解采用多松弛格子玻尔兹曼模型MRT-LBM,稳定性和精度优于单松弛。每个固体边界点使用浸入边界法计算力密度,通过正则化delta函数将力分散到周围流体节点。提出一种快速固体体积分数算法FastSVF,利用扫描线法计算每个流体网格单元内被固体覆盖的面积比例,避免了逐像素循环。该算法复杂度为O(N log N),比传统方法快40倍。动量交换采用隐式耦合,通过迭代求解边界力与流体速度的一致性,使用投影法加速。在非球形颗粒沉降模拟中,计算得到的终端速度与实验值误差小于2.5%。此外,开发了子循环时间步进方案:DEM步长取1e-6秒,LBM步长取1e-5秒,每个DEM步内多次更新力场,显著提高稳定性。
(3)大规模并行化与多孔介质过滤场景验证:
基于MPI和OpenMP混合并行,将计算域划分为均匀块,每个进程负责一个子域,并在边界交换halo层。颗粒数据使用粒子分区迁移,当颗粒跨域边界时自动发送给相邻进程。设计了负载均衡策略,根据每个子域内的颗粒数量动态调整域边界。利用该程序模拟了多孔介质过滤器内非球形颗粒的沉积过程:多孔介质由随机堆叠的圆柱体构成,颗粒形状设为长椭球和四面体。模拟500微秒实际时间,使用256核集群耗时14小时,成功再现了颗粒在孔隙内的架桥现象和压力降变化。与实验对比,滤饼厚度预测偏差在10%以内。程序还扩展了转鼓和流化床模块,能够输出颗粒速度场和流体涡量等值面。
import numpy as np from numba import jit, prange class PolySplit: def __init__(self, vertices): self.vertices = vertices self.convex_parts = [] self._decompose() def _decompose(self): # 简单耳朵切割法 verts = self.vertices.tolist() while len(verts) >= 3: ear_idx = 0 for i in range(len(verts)): a = verts[i-1] b = verts[i] c = verts[(i+1)%len(verts)] if self._is_ear(a,b,c,verts): ear_idx = i break self.convex_parts.append(np.array([verts[ear_idx-1], verts[ear_idx], verts[(ear_idx+1)%len(verts)]])) verts.pop(ear_idx) def _is_ear(self,a,b,c,verts): # 简化凸性判断 cross = np.cross(b-a, c-b) return cross > 0 @jit(nopython=True) def fast_solid_volume_fraction(grid_origin, grid_dx, solid_vertices): # 扫描线算法 n_cells = grid_origin.shape[0] svf = np.zeros(n_cells) for i in range(n_cells): xmin, ymin = grid_origin[i] - grid_dx/2 xmax, ymax = grid_origin[i] + grid_dx/2 # 多边形裁剪面积 area = polygon_clip_area(solid_vertices, xmin, xmax, ymin, ymax) svf[i] = area / (grid_dx**2) return svf def immersed_boundary_force(fluid_vel, solid_vel, delta_func, h): force = (fluid_vel - solid_vel) / h return force class SubcyclingDEM: def __init__(self, dt_lbm, n_substeps=10): self.dt_lbm = dt_lbm self.dt_dem = dt_lbm / n_substeps self.substeps = n_substeps def integrate(self, particles, forces, dt): for _ in range(self.substeps): particles.vel += forces * self.dt_dem / particles.mass particles.pos += particles.vel * self.dt_dem self._resolve_collisions(particles) return particles def mrt_lbm_collision(f, eq, M, S): m = M @ f m_eq = M @ eq m_star = m - S * (m - m_eq) return M_inv @ m_star ",