ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PHAST-SAFETI二次开发教程(05):模型链路解剖——Discharge → Dispersion → Effects 与 UDM

PHAST-SAFETI二次开发教程(05):模型链路解剖——Discharge → Dispersion → Effects 与 UDM PHAST-SAFETI二次开发教程05模型链路解剖——Discharge → Dispersion → Effects 与 UDM版本声明块工具与软件Phast™ 版本主线为 9.x官方模型路径为泄漏到效应的三级链路扩散环节使用 DNV 专有统一扩散模型 UDMUnified Dispersion Model。版本差异以官方发布说明为准。语言与环境官方 Python 库 PyPWS 要求 Python 3.11 及以上官方 Web 服务面向全 SI 单位。本文目标把链路每一环的输入输出契约讲清让为什么上游一改下游全变从直觉变成结构性认识并落成可运行的链路代码。一句话结论Phast™ 的后果链路是三级的严格串行结构——泄漏Discharge由物料、状态、容器与泄漏参数算出释放源项泄漏速率时间序列、释放总量、相态与闪蒸、液池形成速率扩散Dispersion在 UDMUnified Dispersion Model中结合气象与地面条件算出浓度场与云团几何效应Effects再把浓度与几何转成火灾、爆炸与毒性结果这条链路的每一级都以上一级的输出为边界条件因此任何上游偏差都会成量级地传到下游这也是为什么契约比参数更值得你关注。〇、本篇要解决的认知问题Q1官方的模型路径到底有哪几级它们之间的依赖是串行还是并行Q2UDMUnified Dispersion Model在链路里处于什么位置它解决的是什么问题Q3每一级的输入输出契约是什么上游输出直接喂给下游在代码里长什么样Q4经验与唯象模型和 CFD 的边界在哪里什么时候必须换工具Q5这条链路怎样与 PyPWS 的计算对象一一对应为什么不从中间某一级开始跑一、机制解析1.1 三级链路串行的依赖而不是并列的模块官方后果分析的模型路径可以概括为泄漏 → 扩散 → 火灾/爆炸/毒性效应。它不是三个并列的模块而是一条严格的串行链没有释放源项就无从扩散没有浓度分布就无从效应。[ 输入层 ] 物料 Material / 状态 State / 容器 Vessel / 泄漏 Leak / 气象 Weather / 地面与基底 Substrate | v --------------------------------------------------------------- | 1. 泄漏 Discharge释放源项 | | 输入物料 状态 容器 泄漏参数孔径/高度/隔离/放空 | | 输出泄漏速率时间序列、释放总量、相态与闪蒸、液池形成速率 | --------------------------------------------------------------- | 释放速率与时间演化、释放相态、动量与浮力、液池 v --------------------------------------------------------------- | 2. 扩散 Dispersion含 UDM 统一扩散模型 | | 输入释放源项 气象风速/大气稳定度 地面与地形条件 | | 输出浓度场与等值线、云团尺寸与位置、云团随时间的演化 | --------------------------------------------------------------- | 浓度分布 云团几何 v --------------------------------------------------------------- | 3. 效应 Effects | | 3a 火灾 fire 池火 / 射流火 / 闪火 - 火焰长度、池径、 | | 热辐射通量与剖面、闪火范围 | | 3b 爆炸 explosion 超压与冲量可含阻塞与障碍物影响 | | 3c 毒性 toxic 毒性剂量与致死率probit 类剂量-响应表述 | --------------------------------------------------------------- | v [ 结果层 ] 等值线 / 曲线 / 表格 / 3D 视图 / 地图叠加 / Word 与 Excel 报告读图要点注意相态与闪蒸出现在第一级的输出里。这意味着扩散模型的输入不只是多少千克每秒还包括以什么形态释放——气相泄漏与液相泄漏进入扩散环节的物理图像完全不同。这就是第 04 篇强调相态是最敏感假设之一的结构性原因。1.2 UDMUnified Dispersion Model的定位扩散环节使用 DNV 专有的统一扩散模型 UDMUnified Dispersion Model。把它放在链路里看它的职责是把上游的释放源项与下游的气象、地形条件统一起来输出浓度场维度UDM 的角色在链路中的位置第二级上承释放源项下启效应计算主要输入释放速率与时间演化、释放相态与浮力、气象风速、大气稳定度、地面与基底条件主要输出浓度场与等值线、云团尺寸与位置、云团随时间的演化为什么叫统一以同一套处理框架覆盖不同释放形态与不同物质行为的扩散过程工程意义让泄漏—扩散这条最易受参数影响的环节有一套一致、可比的方法学为什么值得单独记住它因为扩散是链路中对输入最敏感的一环。风速与大气稳定度换个取值云团立刻从高瘦变矮胖地面粗糙度改变会改变近地面浓度。当你的自动化流水线要扫描参数时气象与地面维度往往是产出差异最大的维度——第 07 篇会专门讲这一组工况。最佳实践把 UDM 视为链路中唯一不可替换的方法学。你可以替换工况、替换物料、替换孔径但扩散方法学是官方内核的一部分任何自研扩散公式替代 UDM的做法都会让结果失去与官方结论的可比性。1.3 每级的输入输出契约这是本篇的核心把契约当作接口文档来记。环节输入契约输出契约下游如何使用1 泄漏 Discharge物料含组分、物料状态温度、压力、相态、容器形状、容积、充装、条件、泄漏参数孔径、高度、时变选项、闪蒸假设泄漏速率时间序列、释放总量、相态与闪蒸、液池形成速率作为扩散的源项边界条件2 扩散 DispersionUDM上一级的释放源项 气象风速、大气稳定度 地面与基底条件浓度场与等值线、云团尺寸与位置、时间演化作为效应的浓度输入3 效应 Effects浓度分布与云团几何火灾另需几何与热辐射类型设置火焰长度、池径、热辐射通量与剖面、闪火范围超压与冲量毒性剂量与致死率生成等值线、曲线、表格与报告铁律 4单位与坐标系纪律链路全链使用 SI 单位涉及地理叠加时先声明 GIS 坐标基准。契约里最容易出错的就是单位——上游用毫米、下游用米链路照样跑完结果却错一个数量级而且不会报错。1.4 边界什么时候必须离开这条链路情形链路模型是否合适应使用的工具大量工况的筛选、包络与合规论证合适Phast™ 链路秒级近场复杂三维几何的扩散不合适Phast CFD 扩展扩散、KFX™密集阻塞区的燃烧与火灾细节不合适Phast CFD 扩展池火/射流火、KFX™复杂几何下的爆炸载荷不合适EXSIM、Phast 爆炸类扩展风险整合与验收判据LSIR、FN curve、PLL、ALARP链路结果作为输入Safeti™判断口诀“平面假设够不够用、几何细节重不重要”——如果几何与阻塞是结果的控制因素就离开链路去用 CFD如果只是要知道影响范围大概多远链路就是正确工具。而风险层面的整合LSIR、FN curve、PLL、IRPA 与 ALARP 判据属于 Safeti™ 的职责不在 Phast™ 链路内。1.5 链路与 PyPWS 计算对象的对应官方接口把这三级链路映射成一组计算对象上游输出状态直接作为下游输入形成一条对象流VesselStateCalculation VesselLeakCalculation 容器内物料状态 泄漏/释放Discharge | | | outputState状态契约 | dischargeRecords泄漏记录契约 -------------------------------------- | v JetFireCalculation 射流火效应Effects 之一 | | 火灾几何与辐射设置 v RadiationTransectCalculation 沿断面的热辐射剖面结果链路环节对应计算对象关键输出容器内物料状态链路起点VesselStateCalculationoutputState泄漏/释放DischargeVesselLeakCalculationdischargeRecords、material、vesselConditions火灾效应JetFireCalculation射流火几何与热辐射相关结果结果提取RadiationTransectCalculation指定断面上的热辐射剖面经验法则永远从链路起点开始跑。即使你只关心热辐射也必须先把容器状态与泄漏算出来——因为下游的每一个结果都建立在释放源项之上。跳级调用的代价不是报错而是你的输入与官方内核期望的边界条件不一致结果虽有却不可信铁律 7 的回归会立刻暴露它。二、完整操作与脚本/API 代码逐段剖析2.1 在 GUI 中逐环核对链路操作步骤清单在看代码之前先在桌面上把链路逐环这件事看一遍——界面上的每一组结果都对应链路的一环看清它们的先后关系才算真的理解链路步骤 1 打开第 04 篇建立的“黄金场景”先不动任何参数 步骤 2 在结果视图中找到“泄漏/释放”类结果泄漏速率随时间的变化曲线 步骤 3 核对第一环确认释放总量与容器储量在数量级上自洽源项合理性检查 步骤 4 查看释放相态相关信息气相/液相/两相与闪蒸记录它进入扩散环节的形态 步骤 5 切换到扩散结果查看浓度等值线确认云团几何长度、宽度、下风向延伸 步骤 6 把风速与大气稳定度改为另一组取值再次运行观察云团由“高瘦”变“矮胖”或反之 步骤 7 核对第二环在两组气象下浓度等值线的位置差异是否落在合理范围内 步骤 8 切换到火灾效应结果查看火焰长度、池径如有液池与热辐射通量剖面 步骤 9 核对第三环确认热辐射影响距离与火焰几何尺度之间关系合理不脱节 步骤 10 把上述四类结果泄漏/浓度/几何/辐射按链路顺序抄进对照表作为脚本结果的回归基线这一步的目的是什么让你在界面上亲眼确认上游一改、下游全变的传导性。第 2.2 节的脚本只是把这条传导链写成了对象流如果界面上看不出传导性脚本里的契约传递就只是语法。2.2 链路对象流全代码下面的脚本把 §1.5 的对象流写成可运行结构。注意各计算类与实体的构造参数名、必填项以官方 PyPWS 参考文档为准铁律 2本代码的价值在于契约如何传递与失败如何被拦住。# chain_demo.py —— Discharge - Dispersion/Effects 的对象流契约传递与失败隔离# 说明构造参数名以官方 PyPWS 参考文档为准铁律 2# 本脚本演示契约outputState / dischargeRecords如何在链路上传递。importos# 令牌走环境变量铁律 5frompypws.calculationsimport(# 官方计算类链路的各级VesselStateCalculation,# 起点容器内物料状态VesselLeakCalculation,# 第二级泄漏/释放DischargeJetFireCalculation,# 第三级射流火效应RadiationTransectCalculation,# 结果提取热辐射剖面)frompypws.entitiesimportMaterial,State,Vessel,Leak,Weather,Substrate# 输入实体frompypws.enumsimportResultCode# 成功判定依据def_must_succeed(step_name:str,calc)-None:统一的失败拦截任何一级失败都立即停止并打印官方诊断消息。codecalc.run()# 每级计算都返回 ResultCodeifcode!ResultCode.SUCCESS:# 显式判定不靠“没抛异常”calc.print_messages()# 走官方诊断通道raiseRuntimeError(f{step_name}失败:{code})# 立刻失败禁止带病传递defrun_chain(case:dict)-dict:跑完整对象流返回可落盘结构化文件的成果字典。materialMaterial(**case[material])# 物料链路全链共用stateState(**case[state])# 物料状态温度/压力/相态vesselVessel(**case[vessel])# 容器形状/容积/充装leakLeak(**case[leak])# 泄漏孔径/高度/时变选项weatherWeather(**case[weather])# 气象风速/大气稳定度substrateSubstrate(**case[substrate])# 地面与基底条件# ---- 第 1 级容器状态链路起点产出状态契约----state_calcVesselStateCalculation(material,state,vessel)# 组合上游实体_must_succeed(容器状态计算,state_calc)# 失败即停holdupstate_calc.outputState# 状态契约交给下游# ---- 第 2 级泄漏/释放 Discharge产出释放源项契约----leak_calcVesselLeakCalculation(material,holdup,leak)# 上游状态作为输入_must_succeed(泄漏计算,leak_calc)# 失败即停dischargeleak_calc.dischargeRecords# 释放源项契约交给扩散与效应# ---- 第 3 级火灾效应以释放源项为输入----fire_calcJetFireCalculation(material,discharge,weather,substrate)# 效应输入组合_must_succeed(射流火计算,fire_calc)# 失败即停# ---- 结果提取沿断面取热辐射剖面 ----transect_calcRadiationTransectCalculation(fire_calc)# 以火灾结果为上游_must_succeed(热辐射剖面计算,transect_calc)# 失败即停return{# 成果字典字段即契约名outputState:holdup,# 状态契约dischargeRecords:discharge,# 泄漏记录契约material:leak_calc.material,# 归一后的物料vesselConditions:leak_calc.vesselConditions,# 容器条件fireResult:fire_calc,# 火灾效应结果对象radiationTransect:transect_calc,# 热辐射剖面结果对象}if__name____main__:assertos.environ.get(PHAST_API_TOKEN),未配置 PHAST_API_TOKEN铁律 5case{# 一个最小工况数值按工程数据填material:{},# 物料参数以官方参考文档为准state:{temperature:300.0,pressure:1.0e6},# SI开尔文、帕斯卡铁律 4vessel:{},# 容器参数以官方参考文档为准leak:{holeDiameter:0.01},# 10 mm 0.01 mSIweather:{windSpeed:3.0},# 3 m/ssubstrate:{},# 地面条件以官方参考文档为准}resultrun_chain(case)# 串行跑完整链路print(链路完成契约字段:,sorted(result.keys()))# 确认契约齐全便于落盘逐行要点_must_succeed把失败必须响亮这条纪律抽成一处避免每条链路各写一份判定逻辑holdup state_calc.outputState与discharge leak_calc.dischargeRecords是两处契约传递也是整条链路最值得你记住的两行RadiationTransectCalculation(fire_calc)展示结果提取类以效应结果为上游的模式——下游拿着上游的对象而不是拿着散落的数字这正是它能保持单位与坐标系一致的原因。铁律 6批处理幂等 可续跑把上面的run_chain当作流水线的原子单元——一个工况一次调用输入来自结构化文件输出落结构化文件。只有原子单元无副作用、可重复执行第 13 篇的断点续跑与第 17 篇的批量扫描才立得住。2.3 契约检查清单上线前逐项打勾[ ] 单位孔径用米、压力用帕、温度用开尔文、风速用 m/s全 SI铁律 4 [ ] 相态物料状态与孔口闪蒸假设是否与真实工况一致第 04 篇的敏感点 [ ] 上游是否严格从 VesselStateCalculation 起跑而非从中间插队 [ ] 契约outputState 是否传给了泄漏计算dischargeRecords 是否传给了效应计算 [ ] 判定每一级是否都检查了 ResultCode.SUCCESS 并在失败时打印消息 [ ] 气象风速与大气稳定度是否成对设置只给风速是无效输入 [ ] 地面地面与基底条件是否显式设置而非依赖“默认值” [ ] 落盘成果字典的字段名是否与契约名一致便于批量回收与回归三、常见报错与排查报错 3-1跳级调用导致结果有但不合理。现象直接从效应计算起跑程序不报错结果却与预期差很远。根因下游计算期望的边界条件是上游输出的释放源项而你给的是手工拼凑的参数两者在相态、动量与时间演化上不一致。解法永远从VesselStateCalculation起跑让契约由内核生成把链路起点唯一写进你的编码规范。报错 3-2中途某级返回非成功码后续结果为空。现象ResultCode不是成功但脚本继续跑完并输出空结果。根因缺少集中式失败拦截失败被静默吞掉。解法采用 §2.2 的_must_succeed模式在任何一级失败时调用print_messages()并抛异常铁律 7 的前提就是不许无声错误。报错 3-3契约字段缺失下游拿不到状态或泄漏记录。现象下游计算报缺参数或拿到None。根因成果字典漏传了outputState或dischargeRecords或在中间层重建了对象而不是透传。解法把契约字段在成果字典里显式命名如 §2.2 的返回结构并加一条断言检查关键字段非空。报错 3-4扩散结果与直觉不符云团太瘦或太胖。现象云团形态明显偏离经验判断。根因气象输入不完整只给风速、未给大气稳定度或地面与基底条件用了默认值而非真实值。解法回到 §2.3 检查清单的气象与地面两项UDM 的输出对这两组输入极为敏感不要用默认来回避工程判断。报错 3-5同一工况在链路中与 CFD 复核结果差异较大。现象链路结果与 CFD 结果显著不同。根因场景本身超出了链路模型的适用范围近场三维几何、密集阻塞。解法不要试图调参让两者对上正确做法是判断场景是否属于 §1.4 的 CFD 适用栏若是则以 CFD 为准并说明链路结果的适用边界铁律 8不臆造经验参数来凑结果。四、动手练习练习 1默画链路不看本文画出三级链路图并在每一级旁标注输入与输出契约各两项。判定能在 5 分钟内完成且明确指出相态与闪蒸是第一级的输出。练习 2跑通对象流运行 §2.2 的脚本把case里的数值换成本项目的真实工况。判定脚本打印出六类契约字段若某级失败能通过print_messages()的输出定位到具体输入项。练习 3故意破坏契约把outputState换成另一个工况的状态再传入下游观察结果如何变化。判定能定量说明上游状态改变对下游结果的影响幅度从而理解为什么链路必须逐级对齐。练习 4气象敏感性固定其余参数只改风速与大气稳定度组合记录浓度等值线的变化。判定能给出至少四条气象组合—影响距离的对照记录并说明哪一维更敏感。练习 5边界判断给出五个场景厂区内单点泄漏、密集管廊中的泄漏、近场罐区火灾、开阔地储罐池火、复杂装置的爆炸载荷判断哪些适合链路模型、哪些应换 CFD。判定每项都能引用 §1.4 的判据而不是凭感觉。五、小结与下一篇预告本篇把第 04 篇的四步走拆成了结构性认识链路是严格串行的三级Discharge → Dispersion → Effects扩散环节使用官方专有的 UDMUnified Dispersion Model每一级都有明确的输入输出契约而契约在代码里就体现为outputState与dischargeRecords这两处传递经验与唯象模型和 CFD 的分界在于几何细节是否控制结果而链路与官方计算对象的对应关系是VesselStateCalculation→VesselLeakCalculation→JetFireCalculation→RadiationTransectCalculation。第 06 篇《源项与物料》将深入到链路的第一级源项族容器、储罐、管道、长输管道、埋地管道各自适用什么工况恒定泄漏与时变泄漏的差别隔离与放空blowdown如何改变释放曲线标准状态、滞止状态、闪蒸与两相流的概念如何进入模型以及官方物料库2,000 种以上、物性源自 DIPPR与用户自定义物料的使用方式。本篇认知问题回显FAQQ1官方的模型路径有哪几级依赖是串行还是并行A三级泄漏Discharge、扩散Dispersion、火灾与爆炸与毒性效应Effects。依赖是严格串行——第一级由物料、状态、容器与泄漏参数算出释放源项泄漏速率时间序列、释放总量、相态与闪蒸、液池形成速率第二级在 UDM 中结合气象与地面条件算出浓度场与云团几何第三级把浓度与几何转成火灾、爆炸与毒性结果。没有释放源项就无法扩散没有浓度分布就无法计算效应。Q2UDMUnified Dispersion Model在链路里处于什么位置解决什么问题AUDM 处于第二级扩散环节上承释放源项含释放相态与浮力下启效应计算主要输入是释放速率与时间演化、释放相态、气象风速与大气稳定度与地面及基底条件主要输出是浓度场与等值线、云团尺寸与位置及时间演化。它被称为统一是因为以同一套处理框架覆盖不同释放形态与物质行为的扩散过程。工程意义在于让这一最敏感环节具备一致、可比的方法学因此不应以自研扩散公式替代它。Q3每一级的输入输出契约是什么代码里长什么样A第一级输入为物料、物料状态、容器与泄漏参数输出为泄漏速率时间序列、释放总量、相态与闪蒸、液池形成速率第二级输入为上一级释放源项加气象与地面条件输出为浓度场、云团几何与时间演化第三级输入为浓度分布与云团几何输出为火焰长度、池径、热辐射与剖面、闪火范围、超压与冲量、毒性剂量与致死率。代码里契约体现为outputState状态契约与dischargeRecords泄漏记录契约两处传递下游拿着上游的对象而不是散落的数字。Q4经验与唯象模型和 CFD 的边界在哪里A判据是几何细节是否控制结果。大量工况的筛选、包络与合规论证适合用链路模型秒级返回近场复杂三维几何的扩散、密集阻塞区的火灾细节、复杂几何下的爆炸载荷则应使用 Phast CFD 扩展、KFX™ 或 EXSIM。判断口诀是平面假设够不够用、几何细节重不重要。风险层面的整合LSIR、FN curve、PLL、IRPA 与 ALARP 判据属于 Safeti™ 的职责不在 Phast™ 链路内。Q5链路如何与 PyPWS 对象一一对应为什么不从中间起跑A对应关系是VesselStateCalculation产出outputState→VesselLeakCalculation产出dischargeRecords等→JetFireCalculation火灾效应→RadiationTransectCalculation热辐射剖面结果提取。不从中间起跑的原因是下游计算期望的边界条件由内核生成若手工拼凑参数从效应级插队程序不会报错但相态、动量与时间演化与真实源项不一致结果虽有却不可信因此必须严格从容器状态这一链路起点开始逐级传递。
返回列表