You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 03:14:59