关于 DualSPHysics MCP
面向使用 DualSPHysics 的科研人员和 Agent,将本地 SPH 求解器工具链封装为端到端仿真流程。支持参数化建模、后台运行、结果后处理,并可按 Koshizuka & Oka(1996)实验验证二维溃坝案例。
主要功能
- 01检查本地工具与版本
- 02参数化创建和编辑案例
- 03后台运行并查看进度
- 04生成 ParaView VTK 与 CSV
- 05测量结果并验证溃坝案例
适用场景
- 01无需手写 XML 创建二维溃坝案例
- 02监控 CPU 求解任务进度与预计完成时间
- 03将粒子输出转换为 ParaView 文件
- 04对照实验数据计算误差指标
MCP 相关
提供 10 个 MCP 工具,供客户端检查工具链、创建和运行案例、处理测量结果及验证仿真。服务端通过子进程调用本地 DualSPHysics 命令行工具;本项目不分发求解器。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
uvx dualsphysics-mcpDSPH_GENCASEPath to the GenCase_linux64 executable (auto-discovered if unset)DSPH_SOLVERPath to the DualSPHysics CPU solver executable (auto-discovered if unset)DSPH_PARTVTKPath to the PartVTK_linux64 executable (auto-discovered if unset)DSPH_MEASURETOOLPath to the MeasureTool_linux64 executable (auto-discovered if unset)DSPH_JOBS_DIRDirectory for simulation job outputs (defaults to ./jobs)DSPH_OMP_THREADSOpenMP threads for the CPU solver (defaults to CPU count)本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
10收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
DualSPHysics MCP
语言: 英语 | 中文
通过 AI Agent 设计、运行并验证 DualSPHysics 仿真——而不只是看着仿真运行。
十个 模型上下文协议 工具端到端封装本地 DualSPHysics SPH 工具链:使用结构化参数设计案例(无需手写 XML,无需求解器即可迭代),将其作为后台 CPU 任务运行,并随时查看进度、吞吐量和求解器自身的预计完成时间;后处理生成可供 ParaView 使用的 VTK 和 CSV 时间序列;并使用逐时误差及 MAE / RMSE / 最大值,将 2D 溃坝与 Koshizuka & Oka(1996)实验进行验证。
该服务仅将 DualSPHysics 命令行工具作为子进程启动;此处不分发 DualSPHysics 本身——它是免费的 LGPL-2.1-or-later 软件。本软件包既不链接也不重新分发其代码或二进制文件,因此 MIT 许可证不附带任何额外义务。如果你发布了使用 DualSPHysics 的作品,请引用 Dominguez 等人(2022),Computational Particle Mechanics 9:867–895,doi:10.1007/s40571-021-00404-2。
工具
| 工具 | 功能 |
|---|---|
check_environment | 查找此计算机上的四个 DualSPHysics 工具:解析后的路径、来源(环境变量、PATH、扫描)、版本、求解器功能标志;缺少工具时提供安装提示。 |
create_case | 使用简单参数描述 2D 溃坝实验,并生成 GenCase *_Def.xml——无需手写 XML,也无需求解器。返回粒子数量估算值,以便自检。 |
edit_case | 修改现有案例的参数(原地修改或保存至 save_path),并重新验证合并后的结果。 |
describe_case | 将案例文件读取为摘要:dp、计算域、液柱/水箱/障碍物、时间设置、测点、粒子数量估算值。 |
gencase | 将案例离散化为 Case.xml + Case.bi4(以及预览 VTK),并报告实际粒子数量。 |
run_case | 在后台启动 CPU 求解器(jobs/ 目录、Run.out、Part_*.bi4),并立即返回 job_id。 |
job_status | 轮询任务:状态、t/tmax、百分比、求解器的 Time/Sec 吞吐量和预计完成时间、Run.out 尾部内容。 |
partvtk | 将 Part_*.bi4 输出转换为供 ParaView 使用的 VTK 粒子文件;筛选器和变量会原样传递。 |
measure_tool | 对指定点进行探测并获取 CSV 时间序列(强制使用逗号分隔,以便确定性解析)。 |
validate_dambreak | 从 CSV 重建坝尖涌浪前沿,并与内嵌的 Koshizuka & Oka(1996)数据序列进行评分:逐时误差 + MAE/RMSE/最大值。 |
工作流程:check_environment → create_case → describe_case →
gencase → run_case → 轮询 job_status → partvtk + measure_tool →
validate_dambreak。术语、三项保护措施和粒子数量估算算法:docs/case-generation.md。
领域约定
封装工具的一些行为,其 -h 输出不会告知你:
- GenCase 会静默裁剪超出计算域边界框的几何体(退出码为 0,不会发出警告)——
create_case会检查每个计算域是否包含相应几何体。 - DualSPHysics CSV 文件默认使用分号分隔符;
measure_tool会强制使用逗号,除非调用方传入自己的-csvsep。 - MeasureTool 的点文件不接受以
#开头的注释行;MeasureTool 的错误会输出到标准输出,而非标准错误。 Run.out中的Time/Sec表示每模拟秒所耗费的实际秒数,并非每秒步数;行末是求解器预计的完成时间。Run.out的行格式在求解器 v5.0/v5.2 和 v5.4 之间有所不同;解析器兼容这两种格式。
全部十四项约定(格式、退出码):docs/domain-contracts.md。
安装
Python 3.10+。程序会从 DSPH_* 环境变量、PATH 或常见安装根目录(/opt、/usr/local、~/softwares、~、当前工作目录 → <root>/DualSPHysics*/bin/linux)查找二进制文件。
uv sync # or: python -m venv .venv && .venv/bin/pip install -e .
获取求解器(GitHub 仓库附带预编译的 GenCase / PartVTK / MeasureTool,但不包含求解器):
- 从 https://dual.sphysics.org/downloads/ 获取完整软件包,或
- 执行
git clone https://github.com/DualSPHysics/DualSPHysics并使用make -f Makefile_cpu构建 CPU 求解器(仅需 g++,不需要 CUDA),然后从bin/linux/复制预编译工具。
通过环境变量配置(不会解析 .env;参见 .env.example——相同路径也会出现在 examples/mcp_config.example.json 中):
DSPH_GENCASE=/home/<user>/softwares/DualSPHysics/bin/linux/GenCase_linux64
DSPH_SOLVER=/home/<user>/softwares/DualSPHysics/bin/linux/DualSPHysics5.4CPU_linux64
DSPH_PARTVTK=/home/<user>/softwares/DualSPHysics/bin/linux/PartVTK_linux64
DSPH_MEASURETOOL=/home/<user>/softwares/DualSPHysics/bin/linux/MeasureTool_linux64
DSPH_JOBS_DIR=/abs/path/to/jobs # optional, default ./jobs
DSPH_OMP_THREADS=8 # optional, default all cores
运行
.venv/bin/python mcp_server.py # hub-style entry point (stdio)
.venv/bin/dualsphysics-mcp # console script
uvx dualsphysics-mcp # published on PyPI
客户端注册模板:examples/mcp_config.example.json:
{ "mcpServers": { "dualsphysics-mcp": { "command": "uvx", "args": ["dualsphysics-mcp"] } } }
claude mcp add dualsphysics-mcp -- /abs/repo/path/.venv/bin/python /abs/repo/path/mcp_server.py
示例:二维溃坝验证(Koshizuka & Oka 1996)
examples/dambreak_val2d/ 包含展示案例:官方验证布局(dp = 0.01 m;4 m × 3 m 水槽中有 1 m × 2 m 的水柱;TimeMax = 2 s,TimeOut = 0.01 s;Verlet / Wendland / artificial viscosity 0.02 / Fourtakas DDT 0.1),由 gen_dambreak_val2d.py(MIT)重新生成;还包含一个涌浪前沿 MeasureTool 点文件(沿 z = 0.03 m 设置 401 个点)以及数字化实验数据。
此案例的测量结果(GenCase v5.4.354 / solver v5.4.355,8 个 CPU 线程,i5-10210U):
| 数量 | 值 |
|---|---|
| 粒子总数 | 21,001(流体粒子 20,000 + 边界粒子 1,001) |
| Part 文件 | 201 个(Part_0000 … Part_0200) |
| 求解器实际运行时间(TimeMax = 2 s) | ≈ 14 分钟 |
| 坝头相对实验数据的 MAE(0.09–0.75 s) | 0.220 m(占水柱高度的 22.0 %);RMSE 0.240 m |
| 溃坝早期阶段的坝头误差(t ≤ 0.2 s) | 在 ±0.01–0.16 m 范围内 |
| 撞墙 | 前沿在 t ≈ 0.67 s 时到达 3.98 m 处 |

残差来自 SPH 物理模型,并非测量误差:前沿提取结果与求解器自身的 SWL 测点一致(平均偏差 8 mm < 测点间距 10 mm);而实验数据终止于 X/a ≈ 4.13,已超出 4 m 水槽,因此撞墙后对比结果达到饱和(validate_dambreak 会记录 impact_time_s)。
Agent 对话记录:
check_environment() # all four tools found
gencase("examples/dambreak_val2d/CaseDambreakVal2D_Def.xml")
-> particle_counts: total=21001 fluid=20000 bound=1001
run_case("<out>/CaseDambreakVal2D") # returns job_id
job_status(job_id) # poll until percent=100
partvtk(job_id=job_id) # 201 fluid VTK files
measure_tool(job_id=job_id, points_file="examples/dambreak_val2d/points_damtip.txt")
validate_dambreak(csv_path="<measure csv>", points_file="examples/dambreak_val2d/points_damtip.txt")
validate_dambreak 会报告各时间点的误差,以及以米和占 1 m 水柱的百分比表示的 MAE / RMSE / 最大误差。图表由 examples/make_validation_figure.py 生成;examples/render_dambreak.py 可将同一次运行的 Part_*.vtk 转换为 MP4 动画(开发依赖项)。
测试
uv run pytest -q # or: .venv/bin/python -m pytest
uv run ruff check .
即使未安装任何求解器,测试套件也能全部通过(包括发现、命令构造、日志样例解析、验证计算、案例生成和 stdio 端到端测试)。标记为 solver 的测试会调用真实的本地工具链,否则会自动跳过。
内容
src/dualsphysics_mcp/— MCP 服务、工具发现与配置、错误代码,以及tools/中的十个工具。examples/— 验证案例、create_case_demo.py、图表和动画脚本、客户端模板。tests/— pytest 测试套件(求解器测试会自动跳过)。
仓库规则
- 纳入版本控制:源代码、测试、示例、文档、模板。
- 不纳入版本控制:DualSPHysics 二进制文件或源代码(LGPL 相关内容不纳入),
虚拟环境、
.env、作业输出和生成的结果。 examples/dambreak_val2d/中的实验值是数字化事实,引用自随 DualSPHysics 示例一同提供的 Koshizuka & Oka(1996);生成的案例 XML 和此处的所有代码均为原创 MIT 内容——详情见 CONTRIBUTING.md。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。