在 Dymola 中检查模型和翻译模型有什么区别
What is the difference between check a model and tranlate a model in Dymola
我正在使用 Dymola,但我不确定检查模型和翻译模型之间的区别。
所以我做了一个测试。
这里是连接器的代码和模型文件
connector Port
flow Real Q;
Real P;
Real T;
end Port;
model Inlet
parameter Real Q = 1;
parameter Real P = 2;
parameter Real T = 3;
Port a;
equation
a.Q = Q;
a.P = P;
a.T = T;
end Inlet;
如果我检查模型,Dymola 会生成一个 .mof 文件:
model lab.Inlet
parameter Real Q = 1;
parameter Real P = 2;
parameter Real T = 3;
Real a.Q;
Real a.P;
Real a.T;
// Equations and algorithms
// Component
// class lab.Inlet
equation
a.Q = Q;
a.P = P;
a.T = T;
end lab.Inlet;
如果我翻译模型,.mof 文件如下所示:
model lab.Inlet
parameter Real Q = 1;
parameter Real P = 2;
parameter Real T = 3;
Real a.Q;
Real a.P;
Real a.T;
// Equations and algorithms
// Component
// class lab.Inlet
equation
a.Q = Q;
a.P = P;
a.T = T;
a.Q = 0.0;
end lab.Inlet;
我看到翻译生成的.mof文件里多了一行:a.Q = 0.0;.
所以,我的问题是检查和翻译的详细区别是什么?是否有关于此主题的详细文档?
检查模型应该只创建一个小的中间模型,可以检查逻辑错误(#eqs == #unknowns 等),但不用于之后的符号操作。
实例化模型应该创建一个可用于符号操作的平面模型。
转换模型应该首先 运行 实例化,然后执行符号操作(BLT 等)并实际创建模拟代码。
OpenModelica 就是这样做的,我不能确定 dymola 做了什么,但我想这给了你一个想法。我不知道是否有任何进一步的文件解释。
添加到另一个答案。
TL:DR;
- 检查通常假定模型将是较大模型的子组件。
- 翻译用于 运行 模型,即模型本身应该是完整的。
更长的版本:
对于 "Check" 组件 通常 检查假定与连接器 a
的通用连接(通常与所有连接器的通用连接)。该连接将添加一个方程式,因此该模型中将有一个方程式太多——但我们不知道到底是哪一个。
还有一些额外的实例化检查,但是 通常 缺少修饰符(参数值和部分模型的重新声明)被视为非问题 - 因为它不是完整的模型。
对于 "Translate",假设您正在翻译一个完整的模型,并且 a
等非因果连接器将默认连接,即流设置为零 - 这给出了特定的你看到的错误信息。 (并且 public 顶级输入将从 dsu.txt 中读取。)此外,模型被转换为 C 代码,这需要更多。
通常 "Check" 在 "Translate" 之前停止,例如,不求解其他答案中指示的方程组。
但是,在最新版本的 Dymola 中,如果模型有 "experiment" 注释,"Check" 也会检查(假定您正在检查完整模型)- 忽略 通常以上。
最新版本的 Dymola 也会报告连接器问题 Port
:
The connector is not balanced, it has 1 flow variables and 2
non-causal non-flow variables (including possible over-determined
ones).
对于 "Check" 这对于某些模型来说是个问题,因为 Dymola 必须为每个 Port
-连接器添加 1 或 2 个方程。
我正在使用 Dymola,但我不确定检查模型和翻译模型之间的区别。 所以我做了一个测试。
这里是连接器的代码和模型文件
connector Port
flow Real Q;
Real P;
Real T;
end Port;
model Inlet
parameter Real Q = 1;
parameter Real P = 2;
parameter Real T = 3;
Port a;
equation
a.Q = Q;
a.P = P;
a.T = T;
end Inlet;
如果我检查模型,Dymola 会生成一个 .mof 文件:
model lab.Inlet
parameter Real Q = 1;
parameter Real P = 2;
parameter Real T = 3;
Real a.Q;
Real a.P;
Real a.T;
// Equations and algorithms
// Component
// class lab.Inlet
equation
a.Q = Q;
a.P = P;
a.T = T;
end lab.Inlet;
如果我翻译模型,.mof 文件如下所示:
model lab.Inlet
parameter Real Q = 1;
parameter Real P = 2;
parameter Real T = 3;
Real a.Q;
Real a.P;
Real a.T;
// Equations and algorithms
// Component
// class lab.Inlet
equation
a.Q = Q;
a.P = P;
a.T = T;
a.Q = 0.0;
end lab.Inlet;
我看到翻译生成的.mof文件里多了一行:a.Q = 0.0;.
所以,我的问题是检查和翻译的详细区别是什么?是否有关于此主题的详细文档?
检查模型应该只创建一个小的中间模型,可以检查逻辑错误(#eqs == #unknowns 等),但不用于之后的符号操作。
实例化模型应该创建一个可用于符号操作的平面模型。
转换模型应该首先 运行 实例化,然后执行符号操作(BLT 等)并实际创建模拟代码。
OpenModelica 就是这样做的,我不能确定 dymola 做了什么,但我想这给了你一个想法。我不知道是否有任何进一步的文件解释。
添加到另一个答案。
TL:DR;
- 检查通常假定模型将是较大模型的子组件。
- 翻译用于 运行 模型,即模型本身应该是完整的。
更长的版本:
对于 "Check" 组件 通常 检查假定与连接器 a
的通用连接(通常与所有连接器的通用连接)。该连接将添加一个方程式,因此该模型中将有一个方程式太多——但我们不知道到底是哪一个。
还有一些额外的实例化检查,但是 通常 缺少修饰符(参数值和部分模型的重新声明)被视为非问题 - 因为它不是完整的模型。
对于 "Translate",假设您正在翻译一个完整的模型,并且 a
等非因果连接器将默认连接,即流设置为零 - 这给出了特定的你看到的错误信息。 (并且 public 顶级输入将从 dsu.txt 中读取。)此外,模型被转换为 C 代码,这需要更多。
通常 "Check" 在 "Translate" 之前停止,例如,不求解其他答案中指示的方程组。
但是,在最新版本的 Dymola 中,如果模型有 "experiment" 注释,"Check" 也会检查(假定您正在检查完整模型)- 忽略 通常以上。
最新版本的 Dymola 也会报告连接器问题 Port
:
The connector is not balanced, it has 1 flow variables and 2 non-causal non-flow variables (including possible over-determined ones).
对于 "Check" 这对于某些模型来说是个问题,因为 Dymola 必须为每个 Port
-连接器添加 1 或 2 个方程。