如何避免 Modelica 大输出文件
How to avoid Modelica Large Output File
我有一个外部函数,我需要在模拟过程中最多调用两次。它具有大小为 Real[n][m][k]
的大输出,其中 n、m 和 ks 的乘积是一个相对较大的整数。我在 when 语句中调用该函数。我遇到的问题是函数的输出在每次迭代中被一遍又一遍地复制到 .mat 文件中,导致它非常大,即使我不经常使用输出。我想知道是否有一种方法可以只存储一次输出,并且避免在每个时间步长的结果文件中存储输出的副本。
P.s。如果那不可能,我可能会尝试将函数的结果存储在另一个文件中,但需要在模拟中使用它们。因此,作为替代方案,还有一种方法可以让模拟忽略在结果文件中存储变量。
我认为没有办法只在特定时间点存储变量子集。
Select 变量
可以做的是使用 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;
在上面的代码中,y1
和x2
将不会显示在结果文件中。
保护变量
作为上述方法的替代方案(感谢 Hans O. 指出这一点),也可以使用 protected
变量。默认情况下,它们不会存储在结果文件中。此外,它们将无法从模型本身的更高层级访问。参数也不会出现在参数对话框中。
下面是应用了 protected
的相同示例(无法从外部修改 parameter 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;
选择时间
一些模拟器还提供了仅在定义的事件上存储的可能性。对于 Dymola,这将例如是:
when x > 0 then
Dymola.Simulation.TriggerResultSnapshot();
end when;
注意:它存储所有变量,而不仅仅是一个子集。
我有一个外部函数,我需要在模拟过程中最多调用两次。它具有大小为 Real[n][m][k]
的大输出,其中 n、m 和 ks 的乘积是一个相对较大的整数。我在 when 语句中调用该函数。我遇到的问题是函数的输出在每次迭代中被一遍又一遍地复制到 .mat 文件中,导致它非常大,即使我不经常使用输出。我想知道是否有一种方法可以只存储一次输出,并且避免在每个时间步长的结果文件中存储输出的副本。
P.s。如果那不可能,我可能会尝试将函数的结果存储在另一个文件中,但需要在模拟中使用它们。因此,作为替代方案,还有一种方法可以让模拟忽略在结果文件中存储变量。
我认为没有办法只在特定时间点存储变量子集。
Select 变量
可以做的是使用 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;
在上面的代码中,y1
和x2
将不会显示在结果文件中。
保护变量
作为上述方法的替代方案(感谢 Hans O. 指出这一点),也可以使用 protected
变量。默认情况下,它们不会存储在结果文件中。此外,它们将无法从模型本身的更高层级访问。参数也不会出现在参数对话框中。
下面是应用了 protected
的相同示例(无法从外部修改 parameter 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;
选择时间
一些模拟器还提供了仅在定义的事件上存储的可能性。对于 Dymola,这将例如是:
when x > 0 then
Dymola.Simulation.TriggerResultSnapshot();
end when;
注意:它存储所有变量,而不仅仅是一个子集。