news 2026/9/17 10:30:38

血管分叉血流动力学仿真:基于ANSYS Fluent的非牛顿流体模型与WSS计算

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
血管分叉血流动力学仿真:基于ANSYS Fluent的非牛顿流体模型与WSS计算

简介:针对医学领域血管内血液流动模拟的ANSYS Fluent有限元分析案例包,面向生物医学工程、流体力学及CFD学习者与研究者,可用于掌握血管模型导入、网格划分、非牛顿流体参数设置及流场后处理等关键环节。压缩包内共75个文件,以gz数据/网格文件为主,辅以wbpj工程文件、wbjn脚本、step几何模型及少量c/h源码,总大小约823MB。内含动脉分叉三维模型bif_artery.STEP与完整Fluent工程配置,可还原从几何建模到求解输出的全过程;dat、msh等文件则便于直接查看网格与结果数据。已有1459人学习下载。通过该资源可获取带分支血管的三维几何、Fluent求解设置、监测数据与后处理文件,直接复现血液流速、压力及壁面剪切应力分布,为心血管疾病机制研究或人工血管/支架等器械设计提供直观的模拟参照。

1. 血管内血流模拟不是换一下密度:bif_artery.STEP 和 ex2-5 这个工程要解决什么问题

在动脉分叉位置,血液的黏度并不是常数。低剪切区红细胞聚集会让表观黏度比高剪切区高出几倍,如果直接把血液当水一样的牛顿流体算,壁面剪切应力(Wall Shear Stress, WSS)会系统性偏低,这种误差足以改变对动脉粥样硬化斑块位置和血栓风险的判断。这个资源包里的仿真目标,就是围绕一个分叉动脉几何bif_artery.STEP,用 ANSYS Fluent 把速度场、压力场和壁面剪切应力完整算一遍,配套工程文件是ex2-5.wbpj,属于典型的心血管 CFD 入门到进阶工程。严格说这是计算流体动力学,但 Workbench 把流体有限体积法和结构有限元共用同一套项目文件管理,所以你看到的是.wbpj工程结构。适合做血流动力学研究、心血管介入器械仿真,以及想把手头医学 STEP 模型跑通 Fluent 全流程的工程师。

2. Workbench 项目文件与几何前处理:从 ex2-5.wbpj 到可算的血管流道

2.1 解包后先分拣这些文件

拿到压缩包,最忌讳的是双击ex2-5.wbpj之前不看包里有哪些辅助文件。这个项目里有ex2-5_filesdp0user_files.lock.backup,还有journal1.wbjnjournal2_crashed.wbjn。其中.wbjn是 Workbench 录制脚本,崩掉的项目会用journal_crashed记录刚才的视图操作,可以直接删除,不影响几何和网格数据。建议先在命令行里解压并逐层查看:

7z l "【有限元分析】医学领域-血管内血液流动模拟-ansys fluent.rar" mkdir -p workdir 7z x "【有限元分析】医学领域-血管内血液流动模拟-ansys fluent.rar" -oworkdir cd workdir ls -la

7z l只列内容不解压,7z x再解压到workdir目录,-o指定输出路径,避免把dp0user_files直接撒在桌面。解压后你会看到bif_artery.STEPex2-5.wbpj放在同一层,说明这个 Workbench 项目的几何源文件是外部 STEP,而不是 DM 内部草图。以后只要保留bif_artery.STEP,即使.wbpj文件损坏,也能重新建立完整流程。

真正有用的只有三类东西:ex2-5.wbpj是项目入口,bif_artery.STEP是三维血管几何源文件,dp0ex2-5_files里保存的是网格划分、Fluent 求解配置和结果数据。.lock文件是 Workbench 的进程锁,如果之前的 ANSYS 进程没有正常退出,这个文件会残留,但不会影响计算。

2.2 STEP 几何修复与流体域抽取

bif_artery.STEP一般是从 CT 重建或者 CAD 建模软件导出的血管实体。很多医学模型 STEP 导出的只有血管外表面或者包含壁厚,不能直接拿来当流体域。常见做法是在 DesignModeler 或 SpaceClaim 里先把血管内腔抽出来:

  1. 在三维视图里检查三根血管端口的边缘线是否闭合。分叉血管通常有一个入口、两个出口,如果端口不是完整圆形,先用Surface From EdgesFill把端口面补上。
  2. Volume ExtractVolume Fill创建内腔几何。以 SpaceClaim 为例,选中血管内壁表面后使用Volume Extract,软件会自动生成被表面封闭的内部体积。
  3. 删掉原来的血管实体,只保留新的流体域。这一步语法很简单,但很容易漏删厚壁壳,导致后续网格在壁厚方向上多出一层多余单元。
  4. 在网格划分之前给边界命名。命名不要用中文,不要带空格,优先用inletoutlet_aoutlet_bvessel_wall这种短名称,Fluent 的后处理和 TUI 命令对非 ASCII 名称的兼容性不稳定。

如果发现 STEP 导入后表面出现缝隙,可以在 DesignModeler 里先执行Tools > Repair Geometry > Merge Coincident Edges,再执行Simplify > Auto Simplify。对于 CT 重建模型,还要检查是否存在小倒刺或非流形边,这类问题会让 Fluent Meshing 的 Watertight Workflow 在定位面阶段直接报错。

2.3 边界命名与 Fluent 边界类型对应

在给边界命名时,脑子里就要把名字映射到 Fluent 的边界条件上,否则后面很容易把两个出口搞混。下面是这个分叉血管案例的命名表:

边界命名对应几何位置Fluent 边界类型作用
inlet主血管入口截面velocity-inlet根据入口流量换算平均速度
outlet_a上分支出口截面pressure-outlet给定出口压力,允许回流
outlet_b下分支出口截面pressure-outlet给定出口压力,参与流量分配
vessel_wall血管内壁面wall刚性无滑移壁面,WSS 提取面

vessel_wall是整个仿真里最重要的边界,因为后处理要看的 WSS 就在这上面。如果在 SpaceClaim 里忘了命名,也可以在 Fluent 里用Boundary Conditions面板逐个重命名,但网格文件里wall可能被分成很多个 zone,逐个合并很浪费时间。我一般会在几何阶段就把壁面统一成一个共享拓扑,再进 Fluent Meshing 做水密网格。

3. 血液非牛顿黏度与边界条件:不能用 1050 kg/m³ 的水代替血

3.1 为什么血液在分叉处必须用剪切稀化模型

血液是悬浮液,红细胞在低剪切速率下会聚集成缗钱状,表观黏度升高;剪切速率升高后红细胞变形拉伸,黏度下降。这就是剪切稀化。在动脉分叉内侧和狭窄下游会存在低速回流区,那里的剪切率可能只有 1–10 s⁻¹,如果按牛顿流体的恒定黏度算,回流区内的黏性耗散和壁面剪切应力都不可信。

Flunet 的 Material 面板里内置了多种非牛顿模型,最常用的是 Carreau 模型。其黏度公式为:

[ \mu = \mu_\infty + (\mu_0 - \mu_\infty)[1 + (\lambda \dot\gamma)^2]^{(n-1)/2} ]

其中 ( \mu_0 ) 是零剪切极限黏度,( \mu_\infty ) 是高剪切极限黏度,( \lambda ) 是时间常数,( n ) 是幂指数。文献中比较常用的血液 Carreau 参数如下:

参数含义常用取值
( \mu_0 )零剪切极限黏度0.056 Pa·s
( \mu_\infty )高剪切极限黏度0.00345 Pa·s
( \lambda )剪切率变化驰豫时间3.12 s
( n )幂律指数0.3568
( \rho )血液密度1050 kg/m³

这套参数在动脉血流模拟里被引用很多,拿到案例后如果不是专门研究红细胞流变学,直接按这个表设置就能跑出合理结果。

3.2 用 UDF 把 Carreau 黏度写进 Fluent 2020

虽然 Fluent 高版本可以直接选择 Carreau 模型,但在 Workbench 2020 配套的 Fluent 里,非牛顿材料面板一般只显示 Power Law 或 Cross,这时候写一段 UDF 最省事。用DEFINE_PROPERTY定义黏度:

#include "udf.h" #define RHO_BLOOD 1050.0 #define MU0 0.056 #define MUINF 0.00345 #define LAMBDA 3.12 #define N 0.3568 DEFINE_PROPERTY(blood_viscosity, cell, thread) { real shear = C_STRAIN_RATE_MAG(cell, thread); real mu = MUINF + (MU0 - MUINF) * pow(1.0 + pow(LAMBDA * shear, 2.0), (N - 1.0) / 2.0); return mu; }

C_STRAIN_RATE_MAG是 Fluent UDF 提供的局部剪切速率幅值宏,pow是标准数学库函数。编译方式有两种:在 Fluent 控制台执行define/user-defined/functions/compile,或者直接把.c文件放到 Workbench 的工程目录里,在 Fluent 面板选中Interpreted UDF。这段 UDF 的返回值就是 Fluent 在每个单元上计算黏度时使用的系数,不需要再在材料面板里设置两个以上的非牛顿参数。

如果你用的 Fluent 版本支持直接选 Carreau,也可以不写 UDF,把mu0muInflambdan填进材料属性即可。UDF 的好处是参数可以改成变量的形式,比如把lambda随红细胞容积比变化,为后续做参数扫描留好口子。

3.3 入口流量、出口压力与壁面条件

稳态计算时,入口可以直接给平均速度。拿颈动脉分叉举例,主流速度约 0.15–0.30 m/s,入口直径约 6 mm,雷诺数大概 300–500,层流假设成立。两个出口给压力出口,相对压力设为 0 Pa,壁面用刚性无滑移。

如果要做脉动血流,入口速度必须随时间变化。常见做法是把一个心动周期的入口速度波形写成 Fluent profile 文件。下面这段 Python 生成一个简单的周期入口 profile:

times = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] velocities = [0.12, 0.34, 0.42, 0.28, 0.18, 0.12, 0.10, 0.10, 0.11, 0.12, 0.12] with open("inlet_waveform.prof", "w") as f: f.write("((profile transient-inlet\n") f.write(" (time " + " ".join(map(str, times)) + ")\n") f.write(" (v " + " ".join(map(str, velocities)) + ") ))\n")

生成的inlet_waveform.prof第一行profile是类型关键字,后面的timev数组必须一一对应。Fluent 读取后在velocity-inlet边界条件的Temporal Profile下拉框里选择transient-inlet,再设置入口方向沿血管轴线即可。

很多人把入口设成恒定速度,结果在分叉处产生人工回流。其实分叉血流问题里,只要出口是 pressure-outlet 且入口速度不是完全发展的层流剖面,入口段就会自适应调整,关键是要保证入口在远离分叉尖叫区,一般需要留出至少 5 倍入口直径的直管段。

4. 求解器设置与收敛监控:残差之外还要看流量守恒

4.1 层流与空间离散的选择

血液在中等动脉里的雷诺数大多在几百的范围,层流是合理的起点。Fluent 默认的 ( k-\epsilon ) 湍流模型在这个场景里并不适合,因为它会人为抬高分流区的湍动能。如果需要考虑狭窄后流动分离,可以用 Transition SST 做对比,但不要一上来就开湍流模型。

离散格式上,压力建议用 Second Order,动量用 Second Order Upwind。这个选择会让收敛略慢,但 WSS 对近壁速度梯度敏感,一阶迎风的速度耗散太强,算出来的壁面剪切应力会明显偏低。Fluent 2020 下可以在Solution Methods面板里设置,或者在 TUI 里逐项改。常见做法是先跑 200 步一阶格式做初始化,再切换二阶继续收敛。

4.2 瞬态计算的时间步长与库朗数

如果入口加载了脉动波形,就必须做瞬态计算。时间步长的下限由两个条件决定:一是髋心动周期的最小特征时间要足够分辨,1 Hz 的心跳周期里收缩期上升段只有 0.1–0.2 s,至少要 20–50 个时间步覆盖这一段;二是空间库朗数 ( CFL = u\Delta t / \Delta x ) 不能太离谱。

对 0.2 mm 左右的网格,峰值速度 0.4 m/s,取 ( \Delta t = 0.001 ) s,算下来 CFL 大约 2。这个量级对 Fluent 的压力基隐式求解器完全能接受。如果发现压力震荡或残差锯齿状跳动,先把时间步缩到 0.0005 s 再跑三个周期。确定时间步后固定它,不要每步都改,否则很难分辨是物理振荡还是数值振荡。

4.3 无图形模式下批量求解与收敛判断

这个案例的求解器配置比较标准,推荐把操作录制成 journal,用命令行批量跑:

fluent 3ddp -g -i solve.jou -t4 tail -f solve.out

-g表示无 GUI 后台运行,-i指定 journal 脚本,-t4使用 4 核并行。第一次操作时在 GUI 里点击File > Write Journal,把 Mesh、Material、Boundary Conditions、Solution Methods、Initialization 全部录进去,以后改网格或者做参数扫描时直接替换文件路径。后面tail -f solve.out是为了实时看输出日志。

残差收敛阈值一般设 continuity 为 1e-4,速度分量为 1e-5。但血流模拟更重要的指标是质量守恒:在 Fluent 里用report/fluxes/mass-flow-rate查看入口和两个出口的质量流量,把outlet_aoutlet_b的流量加起来,与入口流量的偏差超过 0.5% 就必须停下来检查边界条件和网格质量,而不是继续等残差下降。

5. 后处理、journal 回放与复现时最容易翻车的三个点

5.1 WSS 提取与速度剖面后处理

计算完成后,最关心的结果是vessel_wall上的壁面剪切应力。在 CFD-Post 里先创建一个平面截面,显示速度云图,确认分叉口的低流速回流区位置;再新建一个 Contour,在 Location 里选vessel_wall,变量选 Wall Shear。不同版本变量名可能叫Wall Shear或者Wall Shear Stress,在变量列表里确认一下。如果需要定量比较,可以用表达式:

areaAve(Wall Shear)@vessel_wall

这个表达式的意思是计算整个血管内壁上的面积加权平均 WSS。除了平均值,还要看峰值 WSS 的位置,因为很多介入器械的评价指标关心的是局部最大值,而不是平均值。

5.2 用 journal 批量后处理多组计算结果

如果做网格无关性验证或者参数扫描,会有多个.cas.dat文件需要分别后处理。我一般会先在最顺手的那个算例上录制一个post.jou,然后用一段循环脚本批量替换读入文件名:

for dat in results/*.dat do cas="${dat%.dat}.cas.h5" echo "/file/read-case-data ${cas}" > post_batch.jou echo "/display/set/color-map/... " >> post_batch.jou fluent 3ddp -g -i post_batch.jou -t4 > "${dat}.log" done

这里的核心思路是每个.dat都要重新读取对应的.cas.h5,否则后处理脚本会沿用上一个算例的几何拓扑,导致边界名称对不上。实际项目中我会把需要输出的云图和曲线全部录到 journal 末尾,输出成 png 或 csv,这样几十个算例可以一口气跑完。

5.3 复现这个案例时最常翻车的三个点

第一个是边界命名里的空格和中文。很多 CT 建模导出的 STEP 会把边界默认叫solid body surface,有空格,在reportCFD-Post表达式里必须带引号,非常麻烦。建议在几何建模阶段就统一成短英文名。

第二个是出口回流导致发散。分叉血管两个出口的阻力不完全一样,如果某个出口分配到的流量过大,pressure-outlet 就可能产生回流。遇到这个问题不要立刻加长出口管段,先检查入口是否已经完全发展,或者在 pressure-outlet 的回流方向设置里选用:

Normal to Boundary

这个设置会让回流方向垂直于出口边界,在分支出口经常比默认的 local direction 稳定得多。

第三个是壁面光滑假设带来的误差。bif_artery.STEP这个案例默认是刚性光滑管壁。真实血管内壁有内皮凹凸和不规则形貌,这些细节对局部 WSS 影响很大,但算网格时可以先用光滑假设找主流特征,后续再叠加表面粗糙度或者在壁面附近做加密层。网格无关性验证至少要做三套网格,比较出口流场和平均 WSS 的变化小于 2% 才算过关。把outlet_aoutlet_breport/fluxes/mass-flow-rate里的质量流量加起来,与入口流量差小于 0.5%,再开始读 WSS 云图。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 10:28:58

Atlas记忆策略实战:让自定义Agent记住什么、忘掉什么

Atlas记忆策略实战:让自定义Agent记住什么、忘掉什么 【免费下载链接】atlas Source control for agents. Use multiple coding agents, track their changes and query them in one place 项目地址: https://gitcode.com/GitHub_Trending/atlas115/atlas Atl…

作者头像 李华
网站建设 2026/9/17 10:28:23

STM32与ESP-01S手写AT指令和MQTT报文接入云平台

STM32 和 ESP-01S 这套组合,做物联网课设、毕业设计、设备联网改造都绕不开。很多人拿到 ESP-01S 后第一反应是找现成云平台 SDK,或者直接套 MQTT 库,结果一换芯片、一换平台就抓瞎。我这里记录的是手打代码的方式:STM32 只负责串…

作者头像 李华
网站建设 2026/9/17 10:23:31

Word+MathType论文公式居中编号右对齐:制表位与自动编号实战

论文写到最后,格式往往比内容还折磨人。导师一句“公式居中、编号右对齐”,能让不少人卡上一整天。我这些年帮人调过不少论文模板,本科毕设、硕士论文、期刊投稿都有,用 Word 配合 MathType 来做公式居中编号右对齐,是…

作者头像 李华