FluidSim 是一个基于 Python 的开源库,专门用于研究和教学流体动力学,它建立在强大的科学计算库(如 Numpy, FEniCS, OpenFOAM)之上,但提供了非常友好的 Python 接口,让用户可以方便地定义、求解和分析流体问题。

本教程将分为以下几个部分:
- FluidSim 简介:它是什么,为什么选择它?
- 安装与环境配置:如何安装 FluidSim 及其依赖。
- 核心概念:理解 FluidSim 的基本工作原理。
- 入门示例:你的第一个 FluidSim 仿真。
- 进阶教程:修改参数、改变几何、分析结果。
- 资源与学习路径:在哪里找到更多帮助。
FluidSim 简介
FluidSim 的核心优势在于其 “可读性” 和 “可扩展性”。
- 可读性:仿真代码看起来就像物理方程的 Python 实现,非常直观。
sim.state.set('ux', 1.0)就是在设置 x 方向的速度。 - 可扩展性:它不是黑箱,你可以轻松地修改方程、添加新的物理模型(如温度、磁场)、改变边界条件或创建复杂的几何形状。
- 教学友好:非常适合流体力学课程,学生可以快速上手,将理论知识与数值模拟结果进行对比。
- 研究平台:对于研究人员来说,FluidSim 是一个快速验证新想法和算法的理想平台。
FluidSim 目前主要支持两种求解器:
solvers.ns: 用于求解不可压缩的纳维-斯托克斯方程(无粘性或常粘性),模拟如水流、空气等。solvers.taylor_green_vortex: 一个经典的、解析解已知的基准问题,常用于验证代码的正确性。
安装与环境配置
FluidSim 的安装依赖于几个大型科学计算库,最推荐使用 Conda 来管理环境,可以避免很多依赖问题。

步骤 1:安装 Conda
如果你还没有安装 Miniconda 或 Anaconda,请先从 Anaconda 官网 下载并安装。
步骤 2:创建 Conda 环境
打开终端或 Anaconda Prompt,创建一个名为 fluidsim_env 的新环境。
conda create -n fluidsim_env python=3.9 conda activate fluidsim_env
提示:FluidSim 对 Python 版本有一定要求,3.8 或 3.9 是比较稳定的选择。
步骤 3:安装 FluidSim 及其依赖
在激活的环境中,运行以下命令:
# 安装 FEniCS,这是 FluidSim 的核心依赖之一 conda install -c conda-forge fenics # 安装 FluidSim 及其所有可选依赖(包括可视化工具) pip install fluidsim[all]
注意:
fenics的安装可能需要一些时间,因为它包含了大量的编译组件,如果遇到问题,请确保你的网络和系统环境稳定。
步骤 4:验证安装
在 Python 中尝试导入 FluidSim:
python -c "import fluidsim; print('FluidSim version:', fluidsim.__version__)"
如果成功打印出版本号,说明安装成功。
核心概念
在写代码之前,理解 FluidSim 的几个核心对象很重要:
Simul(Simulation): 这是仿真的核心对象,当你创建一个Simul实例时,你就创建了一个完整的仿真“环境”,包含了所有需要的变量(速度、压力等)、参数和求解器设置。State: 存储仿真当前状态的变量,如速度场ux,uy,压力场p等,你可以通过sim.state来访问和修改这些变量。Parameters: 存储所有仿真的参数,如粘性系数nu、密度rho、时间步长dt等,你可以通过sim.params来查看和修改。Output: 负责将仿真结果(如数据、图像、动画)输出到文件,通过sim.output来控制。Solver: 特定问题的求解器,如ns(Navier-Stokes),FluidSim 通过fluidsim.solvers.ns来提供这个求解器。
入门示例:经典的 Taylor-Green Vortex 涡流
这是 FluidSim 自带的最简单、最经典的示例,非常适合入门,它的解析解是已知的,非常适合验证我们的模拟是否正确。
代码实现
创建一个名为 tutorial_1_taylor_green.py 的文件,并粘贴以下代码:
import numpy as np
from fluidsim.solvers.taylor_green_vortex import SimulTaylorGreenVortex
# --- 1. 创建仿真对象 ---
# 这会初始化所有参数和状态变量
sim = SimulTaylorGreenVortex(nx=64, L=2 * np.pi)
# --- 2. 修改参数 (可选) ---
# 我们可以查看或修改参数
print("--- 查看初始参数 ---")
print(f"粘性系数: {sim.params.nu}")
print(f"网格点数 (nx): {sim.params.nx}")
print(f"计算域长度: {sim.params.L}")
# 修改粘性系数,使其更小(更接近无粘流动)
sim.params.nu = 1e-3
# --- 3. 初始化流场 ---
# 使用解析解来初始化流场
sim.init_from_res()
# --- 4. 运行仿真 ---
# 运行到时间 t=1.0
sim.time_stepping.stop = 1.0
sim.run()
# --- 5. 输出结果 ---
# 将最终状态保存到文件中,方便后续用 ParaView 等软件查看
sim.output.print_stdout.write()
sim.output.write.dump visu=True # 保存可视化文件
print("\n--- 仿真完成 ---")
print(f"最终时间: {sim.time_stepping.t:.4f}")
如何运行和查看结果
-
运行脚本: 在终端中,确保你的
fluidsim_env环境已激活,然后运行:python tutorial_1_taylor_green.py
-
查看输出: 你会看到程序输出类似下面的信息,显示时间步进的过程:
--- 查看初始参数 --- 粘性系数: 1e-05 网格点数: 64 计算域长度: 6.283185307179586 --- 仿真完成 --- 最终时间: 1.0000 -
可视化结果: FluidSim 使用
paraview库来生成可视化文件,脚本运行后,会在一个名为results_taylor_green_vortex的文件夹中生成simu_pvtu文件夹,里面包含了.pvtu和.vtu文件。- 安装 ParaView:如果你还没有安装,请从 ParaView 官网 下载。
- 打开文件:启动 ParaView,
File -> Open,选择results_taylor_green_vortex/simu_pvtu/*.pvtu文件。 - 显示结果:在
Pipeline Browser中找到simu_pvtu,点击Apply,然后点击Glyph滤镜,选择Velocity作为Glyph Type,你就可以看到速度矢量场了,你也可以使用Contour滤镜来显示速度大小或涡量的等值面。
进阶教程:修改参数与自定义初始条件
现在我们来尝试一个更复杂的例子:在方腔流中,顶盖以恒定速度移动,带动整个腔体内的流体运动。
代码实现
创建一个名为 tutorial_2_lid_driven_cavity.py 的文件:
import numpy as np
from fluidsim.solvers.ns import Simul
# --- 1. 创建仿真对象 ---
# Simul() 会加载默认的 Navier-Stokes 求解器
sim = Simul()
# --- 2. 修改参数 ---
# 设置物理参数
sim.params.nu = 1e-2 # 粘性系数
sim.params.rho = 1.0 # 密度
# 设置计算参数
sim.params.nx = 128 # x方向网格数
sim.params.ny = 128 # y方向网格数
sim.params.Lx = 1.0 # x方向长度
sim.params.Ly = 1.0 # y方向长度
# 设置时间步进参数
sim.params.dt = 0.001 # 时间步长
sim.params.max_dt = 0.1 # 最大允许时间步长
sim.params.stop_time = 10.0 # 仿真总时长
# --- 3. 设置初始条件和边界条件 ---
# 初始化一个静止的流场
sim.state.init_from_0()
# 设置顶盖的速度 (lid-driven cavity)
# 创建一个 y=L 的顶盖的标记
y_top = sim.params.Ly
# 在顶盖上设置 x 方向速度为 1.0
sim.state.set('ux', 1.0, where=(sim.state.y >= y_top - 1e-6))
# --- 4. 运行仿真 ---
sim.run()
# --- 5. 输出结果 ---
sim.output.print_stdout.write()
sim.output.write.dump visu=True
print("\n--- 仿真完成 ---")
代码解释
Simul(): 直接创建一个默认的 NS 求解器实例。sim.params: 我们详细设置了物理和计算参数。sim.state.init_from_0(): 将所有场初始化为零。sim.state.set('ux', 1.0, where=...): 这是 FluidSim 的一个强大功能。where参数接受一个布尔条件,我们用它来定位到顶盖 (y >= L - 1e-6),并将该区域的速度ux设置为 1.0,这比修改底层代码要简单得多。- 运行和可视化方法与第一个示例完全相同。
资源与学习路径
要深入学习 FluidSim,以下资源非常有用:
-
官方文档 (最重要!)
- FluidSim Documentation: https://fluidsim.readthedocs.io/
- 这是所有信息的最终来源,包含了详细的 API 文档、教程和开发者指南。
-
示例代码
- FluidSim Examples: https://github.com/fluiddyn/fluidsim/tree/main/examples
- 官方仓库中提供了大量示例,从简单到复杂,是学习如何实现各种功能的最佳途径。
-
GitHub 仓库
- FluidSim on GitHub: https://github.com/fluiddyn/fluidsim
- 可以在这里找到源代码、报告问题、参与讨论。
-
学习路径建议
- 第一步:熟练掌握 入门示例 和 进阶示例,理解
Simul,State,Params,Output的基本用法。 - 第二步:阅读官方文档中的 Tutorials 部分,特别是关于如何修改方程和添加新物理场(如温度)的教程。
- 第三步:浏览 GitHub Examples,尝试运行并理解更复杂的例子,如不同几何形状、不同边界条件等。
- 第四步:如果你有特定的研究需求,可以尝试修改 FluidSim 的源代码,官方文档中的 "How to contribute" 部分会给你很好的指导。
- 第一步:熟练掌握 入门示例 和 进阶示例,理解
希望这份教程能帮助你顺利入门 FluidSim!祝你学习愉快!
