Modelica流体库试图具有能够从温度或焓初始化的有用属性。但是,在模拟日志中,出现了一些有点神秘的错误。
记录的错误似乎不会影响模拟,但它们不应该出现,因为:
下面是一个代码,它会在您运行“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.
答案 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。 (非线性求解器可能会得到改进,以避免过度补偿。)