
简介一份聚焦医学领域血流动力学仿真的ANSYS Fluent项目资源面向生物医学工程学生、血管疾病研究者及CFD初学者用于掌握血管内血液流动的有限元/CFD建模与分析思路。压缩包共75个文件以gz数据文件为主同时包含STEP几何文件、Fluent网格msh、工程备份wbpj/wbjn以及结果dat等整体大小823.39MB能支撑从几何导入、网格划分、边界条件设置到求解后处理的完整体验。已有1459人学习浏览。资源内提供了血管分叉三维模型与完整项目配置适合学习非牛顿血液黏性设定、壁面剪切应力提取及流场可视化通过模拟可分析血流速度、压力分布及扰动情况为动脉粥样硬化等研究提供定量参考也可作为课程设计或论文仿真部分的直接参考模板。1. 为什么医学血管仿真默认选 Ansys Fluent而不是“有限元”求解器在介入科医生的桌上CTA影像只能给出血管狭窄几何回答不了“这里的壁面剪切力是否低到容易形成血栓”。要回答这类血流动力学问题需要先重建血管流道再算出速度场、压力场与壁面受力。很多人把这一步笼统归为“有限元分析”实际在 Ansys Workbench 里血流模拟通常由 Fluent 完成采用有限体积法求解质量、动量守恒方程“有限元”更多被当成数值仿真统称沿用下来。这一点不影响临床辅助判断但决定了后续模型设置、网格命名和求解器选项。这里按一条最常用的路径展开CT 分割几何 → Fluent Meshing 网格 → Carreau 非牛顿血液本构 → 瞬态求解 → WSS/OSI 指标提取每个环节都给出参数和踩坑点适合医学影像工程师、研究生以及做植入器械验证的仿真工程师。2. 血管内血液流动模拟的几何前处理从CT分割到Fluent可用的封闭流道2.1 为什么不能把CT体素直接拖进Fluent计算Fluent 的有限体积法要求计算域是一个由封闭曲面围成的流体区。CT 原始体数据是均匀网格的标量场表面没有几何拓扑直接转换出来的 STL 往往带有孔洞、法向反转和非流形边。如果忽略这些问题网格划分阶段就会报出负体积错误浪费后续所有设置。因此第一步是重建出血管内腔的光滑表面并把入口 (inlet)、出口 (outlet)、壁面 (wall) 三个区域分开命名。一个常见错误是只用一个面组表示所有端口后续 Fuent 无法区分血流入口和出口边界条件只能全部设成相同类型。2.2 开源方案用VMTK把CTA数据提成血管表面处理 CTA 或 MRA 时我一般先用 VMTK不一定需要从头在 Mimics 里手工勾轮廓。VMTK 内置了血管中心线提取和水平集分割适合批量处理队列数据。下面这段脚本读取 mha 格式的 CTA 体数据经过阈值分割和 Marching Cubes 提取输出surface.stl。#!/usr/bin/env python3 # 依赖: vmtk, vtk # 输入: ct.mha可从3D Slicer导出 from vmtk import vmtkscripts # 1. 读入CTA体数据 reader vmtkscripts.vmtkImageReader() reader.InputFileName ct.mha reader.Execute() image reader.Image # 2. 阈值分割阈值需要根据对比剂浓度预估 segmenter vmtkscripts.vmtkLevelSetSegmentation() segmenter.Image image segmenter.Method threshold segmenter.Threshold 200 segmenter.Execute() seg_img segmenter.Image # 3. 去掉小噪点并提取三角表面 cleaner vmtkscripts.vmtkImageCleaner() cleaner.Image seg_img cleaner.Execute() extractor vmtkscripts.vmtkSurfaceExtractor() extractor.Image cleaner.Image extractor.Method marching cubes extractor.Execute() writer vmtkscripts.vmtkSurfaceWriter() writer.Surface extractor.Surface writer.OutputFileName surface.stl writer.Execute()vmtkLevelSetSegmentation的Method可以换成local threshold后者在增强 CT 里有钙化邻近区域时表现更好Threshold取 200~300主要看造影剂分布。提取出的表面通常带细微毛刺后续在 Fluent Meshing 里用 Defeaturing Tolerance 清理即可。分割完成后建议在 ParaView 里检查流道是否只有一个连通域。如果血管树分支很多比如冠脉最好沿每条主血管手动裁剪出入口生成多个短管段。这样做的好处是单段网格量能控制在 500 万以下普通工作站也能流畅完成网格无关性验证。2.3 Fluent Meshing水密几何工作流与负体积预防方法现在做血管网格直接用 Fluent Meshing 的 Watertight Geometry 流程不要回到老式 ICEM 逐面映射。工作流依次是导入几何、全局尺寸、局部尺寸、生成表面网格、描述几何、生成体网格。下面这组参数适合直径 3~8 mm 的中大型血管参数项推荐值说明Base Size0.4~0.6 mm取血管平均直径的 15%~20%Min Size0.03~0.05 mm保证狭窄处不丢尺度Prism Layers10~15 层近壁 y≈1 时的边界层分辨率Prism Growth Rate1.1~1.2超过 1.2 容易在转角处产生负体积Defeaturing Tolerance0.02 mm移除 STL 重影面与微小孔洞负体积在 Fluent Meshing 里表现为 inverted cell常见原因是边界层增长比过大或分叉尖角处层数过多。处理办法是在局部尺寸设置里添加一个 Volume Refinement 区域把狭窄段 Base Size 再细化到全局的 1/2而不是单纯靠压边界层。另一个容易忽略的点是边界层总数不要一刀切入口段平直可以 15 层分叉处 10 层足够否则靠近分叉的棱柱体会互相挤压。如果导入的 STL 不干净Fluent Meshing 偶尔会生成孤立的面片旧版本用户常叫它“孤儿网格”。在 Watertight 流程里对应地表现为 detached faces解决办法是 STL 导入后先运行repair选中remove duplicate faces。处理完再进入体网格生成否则即便网格生成成功求解时也会发现某些区域没有物理边界。3. 血管内血液流动模拟的边界条件Carreau参数、入口参数化与多孔介质设置3.1 用Carreau模型描述血液而不是一刀切牛顿流体血液由血浆、红细胞、白细胞构成低剪切率下红细胞聚集导致粘度上升高剪切率下流动变稀。只算血管中心速度分布用牛顿流体近似也能看个大概但如果研究对象是动脉瘤或支架低剪切区剪切率接近零的时刻很多牛顿模型会明显高估壁面剪切应力。Fluent 材料库没有内置血液需要自己创建材料。在 Materials Fluid 中复制 air 或 water将 Viscosity 改为non-newtonian-power-law或carreau。常用 Carreau 参数如下适合中低剪切率的全血零剪切粘度0.056 Pa·s无穷剪切粘度0.00345 Pa·s时间常数 λ3.313 s幂律指数 n0.3568Fluent 里 Carreau 模型的应力应变形式与文献描述略有差异建议在定义材料前先算几个剪切率点确认粘度曲线没有突变。Power Law 模型只有一个一致性系数和一个指数不能表示低剪切平台区Carreau 多两个参数却能覆盖静止和高剪切两端在低速回流区表现更稳定。3.2 入口速度怎么参数化Profile文件和Workbench参数面板真实生理血流是瞬态波形不建议在边界里直接填一个固定速度。常用的做法是写一个 Fluent profile 文件((inlet-velocity transient 4) (time 0.00 0.15 0.35 0.80) (v 0.10 0.80 0.55 0.28))保存成inlet.prof后在 Fluent TUI 里执行file/read-profile inlet.prof再把入口边界条件的速度分量指定为inlet-velocity。这个 profile 的含义是在 0.8 秒心动周期里用四个采样点近似收缩早期的射血高峰与随后的减速段。如果想做参数化分析在 Workbench 中把入口速度列成输入参数Fluent 会在每个设计点自动更新入口条件不需要改网格。出口首选pressure-outlet不要用outflow。颈动脉分叉或股动脉分叉这类多出口模型outflow 依赖流量权重分配初始猜不准就会拖慢收敛pressure-outlet 只需要设置相对压力 0 Pa 或静脉压压差由入口速度驱动形成更容易收敛。3.3 支架或血栓区域的Fluent多孔介质参数设定血管治疗后的随访模型经常要在某一段加入支架网眼或血栓区。逐孔画支架实体工作量大更好的做法是把这个区域设成多孔介质。在 Cell Zone Conditions 里选中目标流体区域打开 Porous Zone。Fluent 需要两个方向上的粘性阻力系数 C1 和惯性阻力系数 C2。先按 Ergun 公式估算C1 1/KC2 3.5(1-ε)/(D_p ε^3)其中 K 是渗透率ε 是孔隙率D_p 是等效颗粒直径。对血栓而言K 约为 10⁻¹¹ m² 量级ε 约 0.6~0.7D_p 取 20 μm。这个数值意味着血栓对流动的阻力极大与支架区差异明显。在 Fluent 面板里方向矢量按血流主方向设置两个正交流方向设相同值。多孔介质开启后残差会有周期性抖动但只要出口流量能稳定复现就属于正常现象。3.4 血管壁先按刚性 wall 处理多数医学仿真文章的第一步都把血管壁当作刚性壁并设定为无滑移。这样会高估壁面剪切应力但好处是边界条件清晰适合做网格无关性和多病例对比。如果目标是评估支架疲劳或血管腔逐期扩张再做双向流固耦合这部分放在最后一章展开。4. Fluent求解设置混合初始化与标准初始化差在哪生理脉动波怎么加载4.1 先判断层流还是湍流医学血管的雷诺数范围跨度很大冠脉平均雷诺数在 100~400升主动脉峰值可以到 3000。雷诺数超过 2000 后会出现瞬时湍流尤其是狭窄后射流区层流假设会低估流动混合。我通常先用层流模型跑一个稳态结果观察速度场和压力场是否有异常振荡如果出现明显回流再切到 k-omega 下的 SST 或 Transition SST。对大多数中等动脉和颅内动脉层流模型足够。4.2 混合初始化与标准初始化的区别血管模型应该选哪种Fluent 初始化有两种Standard Initialization 和 Hybird Initialization。标准初始化直接以入口边界值填充全场不迭代适合形状简单的直管。血管分叉和动脉瘤内部有大量回流区标准初始化容易在瘤囊区域产生与主流方向相反的初始速度导致第一个物理时间步剧烈震荡。混合初始化会先求解一个简化的输运方程得到一个速度散度接近零的初始场同时近壁区也有初始边界层分布。虽然多花几十秒但首步残差往往比标准初始化低一到两个数量级。用于血管仿真时我几乎都选混合初始化。4.3 用UDF加载生理脉搏波并控制时间步长如果 Profile 只写一个周期Fluent 会持续重复播放但遇到心率变化或需要动态波形切换时写 UDF 更灵活。下面这段 UDF 用取余实现周期重复再用两个正弦波叠加出一个简化射血波#include udf.h DEFINE_PROFILE(heart_pulse, thread, position) { real t CURRENT_TIME; real T 0.8; /* 心动周期单位 s */ real v_mean 0.20; /* 平均速度单位 m/s */ real v_peak 0.75; real ft t - ((int)(t / T)) * T; /* 取余实现周期重复 */ /* 用两个正弦波叠加出一个简化射血波 */ real v v_mean v_peak * (0.6 * sin(2.0 * M_PI * ft / T) 0.2 * sin(4.0 * M_PI * ft / T)); begin_f_loop(f, thread) { F_PROFILE(f, thread, position) v; } end_f_loop(f, thread) }代码里ft是周期内时间v_peak控制收缩期最大速度。实际使用时应把超声多普勒或相位对比 MRI 的速度曲线以插值表形式写入 UDF直接套用正弦波不能做临床判断。物理时间步长是另一个容易踩的坑。假设网格最小尺寸 0.05 mm峰值流速 0.8 m/sCourant 数等于 1 时时间步长只有大约 6×10⁻⁵ s一个心动周期要上万步。实际血流模拟一般放宽 Courant 到 10~50。我常用的做法是先设 0.001 s每个心动周期约 800 步跑完两个周期后观察出口流量曲线是否畸变如果畸变明显再降到 0.0005 s。4.4 瞬态流动的监控、收敛判据与自动保存瞬态计算不需要把每个时间步压到残差 1e-6每个物理时间步内迭代到 1e-4 或 1e-5 即可。还必须监控质量守恒入口总质量流率与出口总质量流率之差应小于 0.5%。AutoSave 建议每个物理时间步都保存一次.dat与.cas为后处理保留足够时间分帧。如果磁盘紧张可以每 5 步保存一次但后续计算 TAWSS 时至少需要 20 个以上时间点否则时间平均值没有生理意义。5. 血管内血液流动模拟的后处理WSS、TAWSS和OSI的提取5.1 在Fluent里先看瞬时WSS分布瞬态计算完成后直接在 Fluent 后处理面板创建 Contour变量选wall-shear。血液流动的壁面剪切应力通常只有 0~5 Pa默认色标下限为 0上限可能飞到几百 Pa屏幕一片蓝。把色标上限调到 2 Pa 再显示分叉处的高剪切斑块就能清楚看到。除了 WSS压力降也是重要指标。在 CFD-Post 里可以沿血管中心线创建一条 Line输出静压。跨狭窄压力降等于上游 5 mm 截面平均压减去下游 5 mm 截面平均压临床上的 FFR 近似用狭窄远端压力与主动脉压的比值表达。稳态模拟只需读一组压力值瞬态模拟要分别统计收缩期和舒张末期两个时刻。5.2 用Python把瞬态WSS换算为TAWSS和OSIWSS 是随时间变化的矢量临床常用 TAWSS 和 OSI 两个指标。TAWSS 是 WSS 模长的时间平均OSI 衡量剪切力方向随时间振荡的程度。我通常通过 File Export 导出每个时间步的壁面数据包含节点坐标和 WSS 的 x、y、z 分量。import pandas as pd import numpy as np # 假设导出的每个csv都含 wx,wy,wz 三列 wss_all [] for step in range(20): df pd.read_csv(fwss_step_{step}.csv, skiprows7) wss_all.append(df[[wx, wy, wz]].values) stack np.stack(wss_all, axis0) # (time, nodes, 3) wss_mag np.linalg.norm(stack, axis2) # (time, nodes) tawss wss_mag.mean(axis0) # 时间平均 # 注意OSI 公式里的分子是时间平均后的矢量模 wss_mean_vec stack.mean(axis0) # (nodes, 3) wss_mean_mag np.linalg.norm(wss_mean_vec, axis1) denom tawss 1e-12 osi 0.5 * (1.0 - wss_mean_mag / denom) np.savetxt(hemo_indices.csv, np.column_stack([tawss, osi]), delimiter,)这段代码先把每个节点的三个 WSS 分量按时间维度堆叠再分别求模长的时间平均。TAWSS 单位是 PaOSI 无量纲范围 0~0.5。OSI 接近 0 表示剪切力方向稳定超过 0.3 说明在一个心动周期内出现明显倒流通常是血栓好发区。如果 Fuent 导出 csv 的节点顺序不稳定先按 NodeID 排序再做计算否则结果与壁面网格对不上。5.3 网格无关性与时间步长无关性验证的简捷做法网格无关性是审稿人必问的部分不需要做五套网格常用“加密 1.5 倍”的三步法。把 Base Size 分别改为 0.6 mm、0.4 mm、0.27 mm三套网格都跑至少一个心动周期比较分叉中心线速度峰值和最高 WSS。若 WSS 峰值变化小于 2%就认为网格无关。时间步则把 0.001 s 缩到 0.0005 s 和 0.00025 s比较同一时刻压力场差异。若压力场变化可忽略说明时间分辨率足够。建议把三套网格的节点数、最高 WSS、跨狭窄压降整理成表后续写论文时直接引用。6. 进阶验证用 Ansys System Coupling 做血管双向流固耦合的位移松弛技巧当研究对象是颈动脉分叉、支架植入区或主动脉瘤刚性壁会高估 WSS 的峰值。这时需要在 Workbench 里搭建 System CouplingFluent 提供流体域Transient Structural 提供固体域。很多人第一次做结构壁面的位移在耦合迭代里反复振荡几个时间步后直接发散。一个可以落地的调整是给位移加松弛。在 System Coupling 面板中把 Convergence Criteria 的 RMS 改为 0.01Minimum Number of Coupling Iterations 设为 2Maximum Number 设为 8。位移松弛系数建议从 0.7 开始如果位移振荡则降到 0.5。松弛太低会拖慢每个时间步的耦合收敛超过 0.8 时容易彻底震荡。流体端传给结构端的是壁面压力和剪应力结构端返回的是位移。两者通过 Mesh Mapper 在界面上映射。流体网格和结构网格节点不重合时默认的 Profile Preserving 插值通常够用如果发现压力在界面上出现棋盘格振荡可把插值改为 Conservative 或 Gaussian。时间步长方面FSI 的耦合步长通常比纯 CFD 大 2~5 倍。以心率 75 次/分、心动周期 0.8 s 为例可从 0.0008 s 起算每个周期约 1000 步。若结构位移在一个耦合迭代内变化超过网格最小尺寸的 20%说明步长过大应该缩减到 0.0004 s。验证 FSI 成本是否划算的快捷做法是先保留刚性壁的 WSS 结果再运行两个 FSI 心动周期在分叉口后 5 mm 处取同一参照点的压力峰值差异。若差异小于 5%医学结论不受影响后续参数优化仍用刚性壁若差异大于 10%这类场景不能忽略血管顺应性。报告最终结果时需要把松弛系数、耦合迭代次数和映射插值方法一并写出便于同行在相同稳定配置上复现出相同流场。本文还有配套的精品资源点击获取