
# Mochi (dsh-cae)
[English](README.md) | **中文**
[](https://github.com/DaiYuhangSustc/dsh-cae-plugin/actions/workflows/ci.yml)
[](LICENSE)


**微信公众号** · 不定期推送插件使用文章
DeepSeek Harness 的自然语言驱动 CAE 流水线:agent 接收一句自然语言的仿真请求,驱动完整的 CAD → 网格 → 求解 → 后处理链路,底层依托 build123d、Gmsh、CalculiX、OpenFOAM 与 PyVista。
五个工具覆盖全链路 —— 几何(脚本建模,或外部 STEP 导入加校验/愈合)、一个模式开关背后的固体与流体网格划分、另一个开关背后的线性静力与稳态/瞬态不可压缩 CFD 求解、结果提取与绘图,以及自动化的网格无关性验证 —— 每个阶段结束后将回执(路径、体积、网格质量、场极值)反馈给模型。
## 安装
推荐(Docker):装好 Docker、添加插件、把 `python` 指向预构建镜像——不需要 conda、apt 装 CalculiX、也不需要装 OpenFOAM。镜像在首次使用时自动拉取(约 3–4 GB):
```yaml
python: docker://ghcr.io/daiyuhangsustc/dsh-cae:latest
```
本地解释器(无 Docker):见下方路线。
先装 Python 栈:`pip install build123d gmsh pyvista ccx2paraview`,再装 CalculiX 求解器 —— Debian/Ubuntu 上 `sudo apt install calculix-ccx`,其他平台 `conda install -c conda-forge calculix`(`ccx` 必须在 PATH 上)。
CFD 模式需要安装 OpenFOAM(Foundation v11–13 或 ESI);其 `etc/bashrc` 会被自动探测(`$FOAM_BASHRC`、`/opt/openfoam*`、`/usr/lib/openfoam*`),也可通过 `openfoamBashrc` 指定。
然后把插件装入 profile —— 在 DeepSeek Harness 检出里运行 `dsh`:
- 本地检出(插件开发):`dsh plugin --profile web add /path/to/dsh-cae` —— 以 `link:` 依赖安装;改动插件后 `pnpm build` 并重启界面即可生效。
- 直接 git 检出:`dsh plugin --profile web add https://github.com/DaiYuhangSustc/dsh-cae-plugin.git`(git 安装会运行 `prepare` 构建脚本;pnpm 用户可能需要通过 `allowBuilds` 允许该构建步骤)。
- npm 源安装(发布后):`dsh plugin --profile web add dsh-cae`。
每个 profile 各自维护插件列表 —— 换用其他 profile(如 `headless`)时对该 profile 重复 `add`。
## 启动使用
- 浏览器:`dsh web` 启动 Web 界面,地址 http://127.0.0.1:3080(`--port` 可改端口;默认自动打开浏览器)—— 打开后粘贴自然语言请求,即可看到工具调用与回执的流动。
- 终端:`dsh --profile headless "20×20 mm 方管、长 1 m、水、入口 0.02 m/s —— 稳态层流求解并出压力云图"` 无界面跑单个任务并输出完整记录。
插件装入前已启动的界面看不到它 —— `add` 之后(`link:` 安装则是重新 build 之后)需重启界面。
## 试一试
见 [examples/cantilever.md](examples/cantilever.md):一句中文即可让 `cae_geometry` → `cae_mesh` → `cae_solve` → `cae_post` 生成一端固定、端部受载的悬臂梁,输出 von Mises 云图,并由 `cae_verify` 做网格无关性验证。
另见 [examples/duct-flow.md](examples/duct-flow.md):一句中文即可生成层流管流解(`cae_mesh` fluid 模式 → `cae_solve` steady 模式 → `cae_post`),并与 Shah–London 摩擦常数做验证。
## 五个工具
| 工具 | 模式 | 输入 | 输出 |
| --- | --- | --- | --- |
| `cae_geometry` | `mode: 'build'` \| `'import'` | build:build123d `script`(定义 `part`,可选 `NAMED_FACES`)+ `name`;import:外部 `.step` 路径(+ 可选 `repair`、`nameFaces` 面命名) | build:`.step` 路径、体积、包围盒、命名面及其面积/质心;import:校验/愈合后的 `.step` 路径、面清单(面积/质心/法向)作为边界条件锚点、可选 faces.json 边车文件 |
| `cae_mesh` | `mode: 'solid'` \| `'fluid'` | solid:`.step` 路径、`elementSizeMm`、`elementType`(`tet4`/`tet10`);fluid:管道 `lengthMm`/`widthMm`/`heightMm`/`cellSizeMm`(+ `wallGrading`、完整 `blockMeshDict` 文本、`name`) | solid:`.msh` 路径、节点/单元数、命名组、最小缩放雅可比;fluid:`caseDir`(SI 包围盒、单元数、checkMesh 质量、`checksPassed`) |
| `cae_solve` | `mode: 'static'` \| `'steady'` \| `'transient'` | static:`.msh` 路径、`material`(`youngMPa`、`poisson`)、命名组上的 `constraints`/`loads`;steady/transient:`caseDir`、`inletVelocityMS`、`kinematicViscosityM2S`、`densityKgM3`、字典 `overrides`(+ transient 时间控制 `endTimeS`/`writeIntervalS`/`maxCourant`/`deltaTS`) | static:`.frd`/`.vtu` 路径、`exitCode`、日志尾部;steady:`converged` 与最终残差、VTK 路径;transient:时间步历史、实测最大 Courant 数、VTK 路径 |
| `cae_post` | — | `.vtu`/`.vtk`/`.frd` 路径、`maxima`/`probes`/`plots` 查询(CFD 压力另加 `densityKgM3`) | 带位置的场极值、探针值、云图 PNG 路径 |
| `cae_verify` | `chain: 'structural'` \| `'cfd'` | 对应链路的输入加尺寸列表(structural 用 `elementSizesMm`,cfd 用 `cellSizesMm`)、`metric`、`gciThresholdPercent` | 网格无关性研究:逐级表格、观测阶数(Richardson)+ GCI(Celik 2008)、结论与推荐 |
`cae_solve` 的 `mode='steady'` 与 `mode='transient'` 取舍:内流请求默认推荐稳态;瞬态分支(Euler/PIMPLE,Courant 受限自适应步长)面向真正依赖时间的物理 —— 稳态 vs 瞬态的权衡写在工具描述里,由 agent 推荐、用户决定。
## 从 v0.4 迁移
v0.5.0 是破坏性发布:v0.4 的九个工具名均已移除,v0.4 验证工具的扁平边界条件形态(受约束组名的列表;按组键入的力向量)同样移除。边界条件处处为规范形态 —— `constraints: [{groupName, kind: 'fixed'}]` 与 `loads: [{groupName, vectorN: [fx, fy, fz]}]` —— 由 `cae_solve`(`mode='static'`)与 `cae_verify`(`chain='structural'`)使用。
每个 v0.4 工具都映射到五个 v0.5 工具之一加一个 mode/chain 开关:两个几何工具合并为 `cae_geometry`(`mode='build'` 脚本建模、`mode='import'` 外部 STEP 导入);固体网格器与管道网格器合并为 `cae_mesh`(`mode='solid'` / `mode='fluid'`);结构求解器与两个 CFD 求解器合并为 `cae_solve`(`mode='static'` / `'steady'` / `'transient'`);后处理器变为 `cae_post`;网格无关性研究变为 `cae_verify`(`chain='structural'` / `'cfd'`)。v0.4 的名称与 schema 保留在 git 历史中(重构前的提交 `01fad90`,即 `origin/master` 所在处)供查阅。
## 六阶段工作流映射
本插件覆盖经典的 CAE/CFD 六阶段工作流;阶段 1–5 自动化,阶段 6 刻意留给人工。
| Fluent 阶段 | dsh-cae 覆盖 |
| --- | --- |
| 1 前处理 | `cae_geometry`(build 脚本几何 · import 外部 STEP:校验/愈合/命名面)· `cae_mesh`(solid Gmsh 四面体 · fluid blockMesh 管道) |
| 2 求解器设置 | `cae_solve` 的参数(材料、边界条件、ν);稳态 vs 瞬态由 agent 推荐、用户决定 |
| 3 求解 | `cae_solve` —— `static`(CalculiX)· `steady` / `transient`(foamRun) |
| 4 后处理 | `cae_post`(PyVista) |
| 5 验证 | `cae_verify`(网格无关性,Richardson + GCI);每次求解都附收敛回执 |
| 6 确认 | 刻意留给人工 —— 插件不提供模型验证:提供 receipt 数字与云图,与物理现实的对比由工程师完成 |
## 架构
五个工具一一对应五个 Python 包:`src/tools/{geometry,mesh,solve,post,verify}.ts` ↔ `python/dsh_cae/{geometry,mesh,solve,post,verify}`(另有 `python/dsh_cae/shared` 负责回执发射、依赖自检与 OpenFOAM 案例组装)。TS 层只做编排;每次工具调用是一个一次性的 `python -m dsh_cae.