初始化期间的非致命迭代错误

时间:2016-09-12 21:27:30

标签: modelica

Modelica流体库试图具有能够从温度或焓初始化的有用属性。但是,在模拟日志中,出现了一些有点神秘的错误。

记录的错误似乎不会影响模拟,但它们不应该出现,因为:

  1. 传递给temperature_phX的值应该有效
  2. use_T_start = true,因此不应运行导致错误的“else”选项
  3. 下面是一个代码,它会在您运行“RunMe”时再现错误以及不会产生错误的选项。代表性错误位于底部。

    非常感谢任何有关如何解决此问题的见解。

    model InitialValuesSimplified
    
      outer Modelica.Fluid.System system "System wide properties";
    
      replaceable package Medium =
          Modelica.Media.Water.StandardWater "Medium in the component";
    
      parameter Medium.AbsolutePressure p_a_start=system.p_start
          "Pressure at port a";
    
      parameter Boolean use_T_start=true "Use T_start if true, otherwise h_start";
    
      // Creates error log
      parameter Medium.Temperature T_a_start=
        if use_T_start then 
          system.T_start
        else 
          Medium.temperature_phX(p_a_start,h_a_start,X_start)
          "Temperature at port a";
    
      // No error log
      // parameter Medium.Temperature T_a_start=
      //   if use_T_start then 
      //     system.T_start
      //   else 
      //     system.T_start
      //     "Temperature at port a";
    
      parameter Modelica.Media.Interfaces.Types.MassFraction X_start[Medium.nX]=
          Medium.X_default "Mass fractions m_i/m";
    
      parameter Medium.SpecificEnthalpy h_a_start=
        if use_T_start then 
          Medium.specificEnthalpy_pTX(p_a_start,T_a_start,X_start)
        else 
          1e5 "Specific enthalpy at port a";
    
    
    end InitialValuesSimplified;
    

    运行代码段的代码:

    model RunMe
    
      InitialValuesSimplified initialValuesSimplified;
      inner Modelica.Fluid.System system;
    
    end RunMe;
    

    错误代码示例:

    Log-file of program ./dymosim
    (generated: Mon Sep 12 17:15:19 2016)
    
    dymosim started
    ... "dsin.txt" loading (dymosim input file)
    T >= 273.15
    The following error was detected at time: 0
    IF97 medium function g1: the temperature (= 86.3 K) is lower than 273.15 K!
    The stack of functions is:
    Modelica.Media.Water.IF97_Utilities.BaseIF97.Basic.g1
    Modelica.Media.Water.IF97_Utilities.waterBaseProp_pT
    Modelica.Media.Water.IF97_Utilities.h_props_pT(
    initialValuesSimplified.p_a_start, 
    initialValuesSimplified.T_a_start, 
    Modelica.Media.Water.IF97_Utilities.waterBaseProp_pT(initialValuesSimplified.p_a_start, initialValuesSimplified.T_a_start, 0))
    Non-linear solver will attempt to handle this problem.
    

1 个答案:

答案 0 :(得分:1)

问题在于组合:

parameter Real T_start=if use_T then system.T_start else foo(3,h_start);
parameter Real h_start=if use_T then bar(4,T_start) else 2;

不是象征性地处理为两个不同的情况(use_T而不是use_T),因为这可能导致组合爆炸。相反,它被视为非线性方程 - 并且计算了h_start,但不会影响生成的T_start。

如果您不打算更改这些参数,可以将它们设为最终参数,并在第一个等式中将h_start替换为合适的默认值。 否则,解决方案是为T_a_start提供更好的起始值:

parameter Real T_start(start=300)=if use_T then system.T_start else foo(3,h_start);

请注意,问题不在于缺少起始值,而是默认的起始值(500K)太远,求解器过度补偿并在收敛到293.15K之前变为86K。 (非线性求解器可能会得到改进,以避免过度补偿。)