如何避免 Modelica 输出文件过大

D. *_*CAR 2 modelica openmodelica

我有一个外部函数,在模拟过程中最多需要调用两次。它具有较大的输出大小Real[n][m][k],其中 n、m 和 ks 的乘积是一个相对较大的整数。我在when语句中调用该函数。我遇到的问题是,每次迭代都会在 .mat 文件中一遍又一遍地复制函数的输出,并导致它非常大,即使我很少使用输出。我想知道是否有一种方法只存储输出一次,并避免在每个时间步将输出的副本存储在结果文件中。

Ps 如果这是不可能的,我可能会尝试将函数的结果存储在另一个文件中,但需要在模拟中使用它们。因此,作为替代方案,还有一种方法可以使模拟忽略在结果文件中存储变量。

Mar*_* A. 6

我认为没有一种方法可以仅在某些时间点存储变量子集。

选择变量

可以做的是HideResult避免将它们存储在结果文件中。但它们仍然可以在模拟中使用。举个例子:

model HideRes
  Real y1 annotation(HideResult=true);
  Integer y2;
  parameter Real x1 = 1;
  parameter Real x2 = 2 annotation(HideResult=true);
equation 
  when time > 0.1 then
    y1 = sin(x1);
  elsewhen time > 0.2 then
    y1 = sin(x2);
  end when;
  y2 = 10*integer(y1);

end HideRes;
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,y1x2不会显示在结果文件中。

保护变量

作为上述方法的替代方案(感谢 Hans O. 指出这一点),也可以使用protected变量。默认情况下,它们不会存储在结果文件中。此外,它们无法从模型本身的较高层次结构中访问。此外,参数不会显示在参数对话框中。
下面是应用的相同示例protectedparameter x2不能从外部修改)。

model HideRes
  Integer y2;
  parameter Real x1 = 1;
  
  protected
  Real y1;
  parameter Real x2 = 2;
  
equation 
  when time > 0.1 then
    y1 = sin(x1);
  elsewhen time > 0.2 then
    y1 = sin(x2);
  end when;
  y2 = 10*integer(y1);

end HideRes;
Run Code Online (Sandbox Code Playgroud)

选择时机

一些模拟器还提供仅在定义的事件时存储的可能性。对于 Dymola,这将是:

when x > 0 then
  Dymola.Simulation.TriggerResultSnapshot();
end when;
Run Code Online (Sandbox Code Playgroud)

注意:它存储所有变量,而不仅仅是一个子集。

  • 一个小问题:参数在 Dymola 中不是存储一次,而是存储两次 - 时间对应于开始和停止时间 - 使绘图处理更加统一。随时间变化的变量存储在每个输出点。除了 HideResult 之外,您还可以保护变量(默认情况下不存储它们)或使用变量选择。 (2认同)