OpenModelica并联管道模拟流体再循环的问题及错误咨询
流体再循环系统建模的除零错误解决思路
问题背景
我正在建模一个涉及流体再循环的系统:流体从入口进入后流经pipe1,在到达DPSs孔板前,部分流体被分流至一条并联管道。设置pipe禁止流动反向后,触发了以下除零错误:
"the solver will attempt to manage a division by zero at time 0: pipe.m_flows[1] + max(DPSe.m_flow, 1e-007). This division results in infinity or NaN at time 0, with (a=27123.8) / (b=0), where the divisor b is: pipe.m_flows[1] + max(DPSe.m_flow, 1e-007)."
使用版本:
- OpenModelica v1.14.1 (64-bit)
- OMSimulator v2.1.0-dev-147-g36ec2c7-mingw
建模代码:
model separation replaceable package Medium = Modelica.Media.Water.WaterIF97_ph constrainedby Modelica.Media.Interfaces.PartialMedium; /* Déclaration de la convection forcée*/ replaceable model heatTransfet = Modelica.Fluid.Pipes.BaseClasses.HeatTransfer.ConstantFlowHeatTransfer(alpha0 = conv_ext); /* Déclaration de la conduite */ Modelica.Fluid.Pipes.DynamicPipe pipe(redeclare package Medium = Medium, allowFlowReversal = false, diameter = 5e-3, energyDynamics = Modelica.Fluid.Types.Dynamics.SteadyState, isCircular = true, length = 15, m_flows(fixed = true, start = 0.08), massDynamics = Modelica.Fluid.Types.Dynamics.SteadyState, momentumDynamics = Modelica.Fluid.Types.Dynamics.SteadyState, nNodes = 5, roughness = 3.2e-05, use_HeatTransfer = false) annotation( Placement(visible = true, transformation(origin = {-2, 10}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); /* Paroi */ /* Conditions aux limites */ Modelica.Fluid.Sources.Boundary_pT inlet(redeclare package Medium = Medium, T = 40 + 273.15, nPorts = 1, p = 14e+5, use_p_in = false) annotation( Placement(visible = true, transformation(origin = {-86, -26}, extent = {{-6, -6}, {6, 6}}, rotation = 0))); Modelica.Fluid.Fittings.SimpleGenericOrifice DPSs(redeclare package Medium = Medium, diameter = 10e-3, use_zeta = true, zeta = 200) annotation( Placement(visible = true, transformation(origin = {37, -26}, extent = {{-7, -8}, {7, 8}}, rotation = 0))); inner Modelica.Fluid.System system(energyDynamics = Modelica.Fluid.Types.Dynamics.DynamicFreeInitial, massDynamics = Modelica.Fluid.Types.Dynamics.DynamicFreeInitial, momentumDynamics = Modelica.Fluid.Types.Dynamics.DynamicFreeInitial) annotation( Placement(visible = true, transformation(origin = {-80, 22}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); Modelica.Fluid.Fittings.SimpleGenericOrifice DPSe(redeclare package Medium = Medium, diameter = 10e-3, use_zeta = true, zeta = 1) annotation( Placement(visible = true, transformation(origin = {-47, -26}, extent = {{-11, -8}, {11, 8}}, rotation = 0))); Modelica.Fluid.Sources.MassFlowSource_T boundary(redeclare package Medium = Medium,T = 40 + 273.15, m_flow = -0.32, nPorts = 1) annotation( Placement(visible = true, transformation(origin = {72, -26}, extent = {{10, -10}, {-10, 10}}, rotation = 0))); Modelica.Fluid.Pipes.DynamicPipe pipe1(redeclare package Medium = Medium,diameter = 10e-3, energyDynamics = Modelica.Fluid.Types.Dynamics.SteadyState, isCircular = true, length = 15, massDynamics = Modelica.Fluid.Types.Dynamics.SteadyState, momentumDynamics = Modelica.Fluid.Types.Dynamics.SteadyState, nNodes = 5, roughness = 3.2e-05, use_HeatTransfer = false) annotation( Placement(visible = true, transformation(origin = {-2, -26}, extent = {{-10, -10}, {10, 10}}, rotation = 0))); equation connect(inlet.ports[1], DPSe.port_a) annotation( Line(points = {{-80, -26}, {-58, -26}, {-58, -26}, {-58, -26}}, color = {0, 127, 255})); connect(DPSe.port_b, pipe1.port_a) annotation( Line(points = {{-36, -26}, {-12, -26}}, color = {0, 127, 255})); connect(pipe1.port_b, DPSs.port_a) annotation( Line(points = {{8, -26}, {30, -26}}, color = {0, 127, 255})); connect(DPSs.port_b, boundary.ports[1]) annotation( Line(points = {{44, -26}, {62, -26}}, color = {0, 127, 255})); connect(pipe.port_b, DPSe.port_b) annotation( Line(points = {{-12, 10}, {-36, 10}, {-36, -26}, {-36, -26}}, color = {0, 127, 255})); connect(pipe.port_a, DPSs.port_a) annotation( Line(points = {{8, 10}, {30, 10}, {30, -26}}, color = {0, 127, 255})); algorithm annotation( uses(Modelica(version = "3.2.3")), Diagram); end separation;
解决思路
调整初始流量设置
错误源于初始时刻pipe.m_flows[1] + max(DPSe.m_flow, 1e-7)为0,可尝试:
- 给
DPSe的流量设置合理初始值,比如DPSe.m_flow(start=0.24, fixed=true),保证初始总和不为0; - 将
pipe.m_flows的fixed属性改为false,让求解器自动计算符合流量平衡的初始值,避免硬编码冲突。
验证并联回路的流量逻辑
当前并联回路的阻力设置(DPSs的zeta=200远大于DPSe的zeta=1)会导致大部分流量走并联管道,但初始流量分配不合理易触发数值奇异:
- 暂时开启
pipe的allowFlowReversal=true,先让模型运行至稳态,观察实际流量方向和大小,再基于稳态值设置初始流量和单向流动限制; - 检查孔板zeta值是否符合实际系统特性,避免极端阻力差导致初始流量分配异常。
优化除零保护阈值
错误中用到的max(DPSe.m_flow, 1e-7)阈值在初始时刻仍过小,若涉及自定义代码,可将阈值调至更大(如1e-5);若为Modelica.Fluid库内部逻辑,可考虑使用自定义孔板/管道模型替换,调整内部除零保护逻辑。
切换动力学设置
当前管道均设为SteadyState动力学,尝试切换为DynamicFreeInitial:
- 将
pipe和pipe1的energyDynamics、massDynamics、momentumDynamics改为Modelica.Fluid.Types.Dynamics.DynamicFreeInitial,让求解器先收敛到稳态初始点,再启用单向流动限制。
内容的提问来源于stack exchange,提问作者AMINE CHNIOUEL
相关产品推荐
相关产品推荐

