ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

AFT二次开发教程(18):实战二——Fathom → Impulse 水锤分析自动化流水线

2026/10/3 2:33:26 拓冰建站 浏览量
AFT二次开发教程(18):实战二——Fathom → Impulse 水锤分析自动化流水线 AFT二次开发教程18实战二——Fathom → Impulse 水锤分析自动化流水线版本与事实声明产品与版本AFT Fathom 15 / AFT Impulse 12当前转换、初始条件与力导出机制引用官方Fathom 13 / Impulse 10帮助页与产品页正文当前版以官方文档为准。语言/环境Python 3.x标准库 pandas 可选。本文目标读完能搭起稳态 → 瞬态 → 管系载荷的三段式自动化流水线并知道每一段的验收闸门。所有模型、时间步与力数据为示例性建模不代表任何标准规定或真实管系。一句话结论水锤分析自动化流水线是三段式——①Fathom 稳态批跑把工况矩阵的稳态算干净→ ②在 Impulse 里 Open.fth完成互转对象可能降级必须守恒复核→ ③Impulse 瞬态批跑 Export Force File交付CAESAR II/TRIFLEX/ROHR2/AutoPIPE其中瞬态段的成败由稳态初始条件、时间步、瞬态事件定义三者决定。〇、本篇要解决的认知问题Q1为什么水锤自动化要分稳态段和瞬态段两段跑不能一步到位Q2瞬态工况阀关闭、泵停机在 AFT 里怎么组织才能批量化Q3时间步time step怎么定定错会怎样Q4转换后、批跑前、导力前各有一个什么验收闸门Q5这条流水线最终交付什么交付包该含哪些东西一、机制解析18.1 三段式流水线全图┌── 段① 稳态Fathom───────────────────────────────────────────────┐ │ 工况矩阵 → AFT Transfer → G1 导入 → G2 批跑 → Excel 取数稳态解 │ └──────────────────────────────┬─────────────────────────────────────┘ │ 每个稳态工况 → 一个 .fth或一个主模型 ▼ ┌── 段② 转换GUI逐模型─────────────────────────────────────────┐ │ Impulse 里 Open .fth即转换→ 对象守恒复核 → 补输 → Impulse 母模型 │ └──────────────────────────────┬─────────────────────────────────────┘ │ Impulse 母模型 Scenario Manager 组织瞬态事件 ▼ ┌── 段③ 瞬态Impulse─────────────────────────────────────────────┐ │ 瞬态事件场景阀关闭曲线/泵停机曲线→ G2 批跑 → 告警收集 │ │ → Export Force FileCAESAR II/TRIFLEX/ROHR2/AutoPIPE→ 载荷包 │ └───────────────────────────────────────────────────────────────────┘为什么必须分两段瞬态的初始条件来自稳态解第 13 篇官方原文。所以稳态没跑干净 → 瞬态从错的起点出发 →全错稳态是每工况独立的瞬态是每稳态 每事件的——工况数是乘积M 个稳态 × N 个事件 M×N 个瞬态。这直接决定你的场景数管理稳态场景 M 个瞬态场景 M×N 个。若 M20、N3就是 60 个瞬态场景。规模要提前算清第 09 篇的先圈定参数再扫描在这里再次适用。18.2 瞬态事件怎么组织瞬态事件的本质是某个元件随时间变化的动作。典型两类阀关闭valve closure阀在给定时间内从开到关 → 产生水锤泵停机pump trip泵按惯性/惰走曲线降速 → 产生压力波。它们的参数化与稳态没有本质区别——仍然走AFT Transfer只是作用的对象与参数不同阀Open Percentage、Restricted Flow Area等随事件曲线设定具体瞬态曲线字段以官方文档/界面为准泵Fixed Speed (%)、停机相关Special Condition官方 Table 3Pump 的1Pump Off No Flow、2Pump Off With Flow Through。批量组织的最佳实践再次强调转换一次、复用一个 Impulse 母模型、在其内部用 Scenario Manager 组织瞬态事件第 13 篇。这样对象只降级一次复核一次瞬态事件作为场景变化用继承第 08 篇管理批跑一次搞定 M×N 组合。18.3 时间步瞬态最贵的旋钮特征线法MOC的瞬态推进依赖时间步time step。时间步的选择牵动三件事时间步后果太大捕捉不到压力波的陡峰与快速变化——峰值被抹平结果偏乐观危险太小步数暴增 →计算时间与文件体积爆炸数值噪声增多不合理可能触发数值不稳定/收敛问题工程判据经验法则时间步要显著小于你关心的最快瞬态现象的时间尺度。比如阀关闭时间是 2 秒你至少要能分辨出秒级以下的波;对管系更细的水锤特征时间则需要更细的步。具体步长与稳定性判据以官方文档/软件说明为准——AFT 的 MOC 具体离散与波速处理属官方实现细节本系列不编造。批量里的时间步策略先在一个代表工况上做步长敏感性试算同一工况用 3 个步长跑看峰值是否收敛一旦定下整批统一——否则不同工况的峰值不可比若某些工况步数会爆只取关心的时间窗配合第 14 篇的 time frame。18.4 三道验收闸门闸门位置判据闸门 A稳态合格段① 之后稳态守恒、量级合理、物理方向对第 03/11 篇闸门 B转换守恒段② 之后对象总数守恒、降级项已复核第 13 篇convert_check闸门 C瞬态可交付段③ 之后无致命管力告警空化/液柱分离、力文件单位合法第 14 篇三者缺一不可稳态不合格则瞬态无意义转换未复核则对象/参数对不上瞬态告警未查则交付的是不可信的结果。18.5 交付包水锤分析的交付包建议清单surge_deliverable/ ├── manifest.json # 目标软件、单位、模型、场景清单 ├── forces/ # Force FilesCAESAR II/TRIFLEX/ROHR2/AutoPIPE ├── envelope/ # 各结点峰值压力包络第12篇 ├── warnings.md # 批跑告警摘要空化/液柱分离 ├── convert_check.json # 转换守恒复核结果 └── README.md # 交付说明版本、时间步、事件定义注意README.md里必须写清时间步与事件定义——因为不同时间步的结果不可直接比较下游看到峰值时必须知道它是怎么算出来的。二、完整代码与逐行剖析代码 18-1surge_pipeline.py三段式流水线骨架# -*- coding: utf-8 -*- surge_pipeline.py —— 水锤分析三段式流水线骨架稳态→转换→瞬态→载荷 本脚本负责Python 侧的全部自动动作与账本推进三段之间的 GUI 闸门以显式占位提示。 运行python surge_pipeline.py --selftest importargparseimportitertoolsimportjsonimportosimportsys STAGES(steady_designed,steady_done,converted,transient_done,force_packed)defbuild_stage_plan(steady_cases:list,events:list)-dict:生成两段工况计划稳态 M 个瞬态 M×N 个稳态 × 事件。transient[{steady:s,event:e,case_id:f{s}__{e}}fors,einitertools.product(steady_cases,events)]return{steady_cases:list(steady_cases),events:list(events),transient_cases:transient,counts:{steady:len(steady_cases),events:len(events),transient:len(transient)}}defgate_checklist(stage:str)-list:返回该阶段之后必须人工确认的验收项对应 18.4 的三道闸门。return{steady_done:[稳态守恒与量级合理,物理方向正确如加热后温度上升],converted:[对象总数守恒convert_check,降级为 General Component/Branch 的结点已复核,流体与单位集未变,原 AFT Transfer 变更表已按新对象类型重建],transient_done:[无致命管力告警空化/液柱分离,力文件单位合法CAESAR II 只 lbf/N,时间步敏感性已试算并整批统一],}.get(stage,[])defpack_manifest(outdir:str,meta:dict)-str:os.makedirs(outdir,exist_okTrue)pos.path.join(outdir,manifest.json)withopen(p,w,encodingutf-8)asf:json.dump(meta,f,ensure_asciiFalse,indent2)returnpdefselftest():planbuild_stage_plan([C80,C90,C100],[ValveClose,PumpTrip])assertplan[counts]{steady:3,events:2,transient:6},plan[counts]assertplan[transient_cases][0][case_id]C80__ValveClose# 闸门清单必须非空且有实质内容assertlen(gate_checklist(converted))4assertany(守恒inxforxingate_checklist(steady_done))mpack_manifest(selftest_surge,{target:CAESAR II,unit:N,time_step_note:整批统一见 README})assertos.path.exists(m)print(SELFTEST OK3 稳态 × 2 事件 6 瞬态闸门清单齐备交付 manifest 生成。)print(json.dumps(plan[counts],ensure_asciiFalse))defmain():apargparse.ArgumentParser()ap.add_argument(--steady,defaultC80,C90,C100)ap.add_argument(--events,defaultValveClose,PumpTrip)ap.add_argument(--outdir,defaultsurge_deliverable)ap.add_argument(--selftest,actionstore_true)aap.parse_args()ifa.selftest:selftest()return0planbuild_stage_plan(a.steady.split(,),a.events.split(,))print(json.dumps(plan[counts],ensure_asciiFalse))print(段间闸门)forstin(steady_done,converted,transient_done):foritemingate_checklist(st):print(f [{st}]{item})pack_manifest(a.outdir,{target:CAESAR II,unit:N,counts:plan[counts]})return0if__name____main__:sys.exit(main())逐行剖析build_stage_plan()用itertools.product生成M×N 瞬态组合——把稳态 × 事件的乘积关系显式算出来。这样你在动跑之前就知道总共要跑多少个瞬态避免跑一半才发现要跑 60 个。case_id用{steady}__{event}命名稳态身份与事件身份都编码进去交付时一眼能看出这是 100% 转速下的阀关闭。gate_checklist()把 18.4 的三道闸门写成可打印的清单。它不是装饰——它对应第 17 篇 README 的执行顺序每个 GUI 闸门后print一次人照单确认。pack_manifest()记录目标软件、单位、时间步说明——time_step_note字段的存在就是为了让这个峰值是怎么算的永远可追溯18.5 的要求。selftest()断言3×26、case_id命名格式、闸门清单非空——三个立刻能复核的点。代码 18-2step_sensitivity.py时间步敏感性试算记录# -*- coding: utf-8 -*- step_sensitivity.py —— 记录并判定时间步敏感性试算同一工况多步长对比峰值 判据相邻步长的峰值相对差收敛到阈值内经验阈值示例 运行python step_sensitivity.py --selftest importsysdefjudge(samples:list,tol0.02)-dict:samples: [(time_step, peak_pressure), ...] 按步长增大排列。 返回相邻相对差与是否收敛。diffs[]for(s0,p0),(s1,p1)inzip(samples[:-1],samples[1:]):relabs(p1-p0)/abs(p0)ifp0elsefloat(inf)diffs.append({from:s0,to:s1,rel_diff:round(rel,4),converged:reltol})return{diffs:diffs,all_converged:all(d[converged]fordindiffs)}defselftest():# 步长从 1.0s 细化到 0.1s峰值从 118 收敛到 120rjudge([(1.0,118.0),(0.5,119.6),(0.1,119.9)])assertr[all_converged]isTrue,r# 步长仍太粗0.5 - 1.0 差 4% 2%r2judge([(0.5,125.0),(1.0,120.0)],tol0.02)assertr2[all_converged]isFalse,r2print(SELFTEST OK收敛序列判定通过粗步长序列被判为未收敛。)if__name____main__:if--selftestinsys.argv:selftest()逐行剖析judge()用相邻步长的相对差作为收敛信号——这是数值收敛判断的通用思路。阈值tol是经验值标注清楚。只对相邻步长做差而不是全部两两对比因为细化步长→峰值稳定本来就是逐步收敛的过程。selftest()两组样本一组收敛、一组未收敛。未收敛那组用的正是峰值被粗步长抹平的物理直觉粗步长给 120、细步长给 125 → 粗步长偏乐观——这正是 18.3 警告的现象。三、常见报错与排查报错 18-1瞬态结果初始段剧烈跳变。现象t0 附近不连续。根因初始条件来自稳态解而稳态没算对。解法先过闸门 A稳态守恒/量级/方向再跑瞬态。报错 18-2峰值压力明显偏低校核通过了但现场爆管。现象结果偏乐观。根因时间步太大压力波陡峰被抹平。解法做步长敏感性试算代码 18-2整批统一步长宁可细一点峰值保守。报错 18-3转换后某些结点参数对不上变更表导入报错。现象Impulse 侧导入失败。根因对象降级Spray Discharge → General Component 等原表Object Type不存在。解法过闸门 B——convert_check守恒复核 重建变更表。报错 18-4力文件下游读不了。现象CAESAR II 导入失败。根因单位不是lbf/N官方硬约束。解法过闸门 C的单位守卫第 14 篇force_pack.py。报错 18-5批跑跑完才发现在某工况出现空化/液柱分离已错过处理。现象告警被忽略。根因告警出现在Batch Run Status Messages批跑结束才统一显示。解法收集批跑状态消息并用第 14 篇collect_warnings.py过滤把无致命告警作为闸门 C 的一项。四、动手练习练习 1规模核算用surge_pipeline.py计算4 个稳态 × 3 个事件的瞬态数。判定输出transient 12写出乘法式并说明为什么是乘积不是求和。练习 2步长敏感性用一个代表工况跑 3 个时间步记录峰值压力用step_sensitivity.py的判据判断是否收敛。判定给出是否收敛结论与选定的整批步长若未收敛继续细化。练习 3三段实操跑通稳态批跑 → 转换 → 阀关闭瞬态至少 1 个组合导出 1 份 Force File。判定三道闸门各有一次明确结论力文件单位合法N/lbf。练习 4交付包用pack_manifest.py代码 18-1 的pack_manifest生成交付包。判定manifest.json含 target/unit/counts/time_step 说明交付包含 forces/、envelope/、warnings.md、convert_check.json、README.md 五件。五、小结与下一篇预告本篇把批量机器加装成水锤流水线三段式Fathom 稳态 → 转换 → Impulse 瞬态 力导出瞬态工况是M 稳态 × N 事件 的乘积成败取决于稳态初始条件、时间步、瞬态事件定义三道验收闸门稳态合格 / 转换守恒 / 瞬态可交付缺一不可时间步必须做敏感性试算并整批统一否则峰值会静默偏乐观。交付包要能回答这个峰值是怎么算出来的。第 19 篇《工程报表交付自动化》我们收尾最后一百米——把结果变成人能看懂、能签字的交付件Excel 仪表盘、批跑Output Options触发的Adobe PDF、matplotlib 统一图表样式、Export Guide 归档与定时任务。FAQ与第〇节一一对应Q1为什么水锤自动化要分稳态段与瞬态段A因为瞬态的初始条件来自系统的稳态解AFT Impulse 内置稳态求解器自动用它初始化瞬态稳态没跑对瞬态就全错且稳态是每工况独立的、瞬态是每个稳态乘以每个事件组合的两段规模不同必须分开管理。Q2瞬态工况怎么组织才能批量化A最佳实践是转换一次、复用一个 Impulse 母模型在其内部用 Scenario Manager 组织瞬态事件如阀关闭时间、泵停机曲线事件作为场景变化用继承管理从而把 M 个稳态 × N 个事件一次性批完。Q3时间步怎么定定错会怎样A时间步要显著小于所关心最快瞬态现象的时间尺度太大会抹平压力波陡峰使结果偏乐观太小会让步数与文件体积爆炸做法是先在一个代表工况做步长敏感性试算、确认峰值收敛后整批统一步长具体离散与稳定性判据以官方文档为准。Q4转换后、批跑前、导力前各有什么验收闸门A闸门 A 在稳态段后守恒、量级、物理方向闸门 B 在转换后对象总数守恒、降级项复核、流体与单位集未变、变更表已重建闸门 C 在瞬态后无致命管力告警、力文件单位合法、时间步整批统一。Q5这条流水线交付什么A交付包通常含 manifest.json目标软件、单位、场景清单、forces/CAESAR II/TRIFLEX/ROHR2/AutoPIPE 力文件、envelope/峰值包络、warnings.md空化/液柱分离等告警摘要、convert_check.json转换守恒复核与 README.md版本、时间步、事件定义。