arrays - 在 Dymola 中编译大数组
问题描述
请考虑以下小型 Modelica 模型和功能:
model VectorizeDemo
parameter Integer na=5;
final parameter Integer nb=2*na;
final parameter Real a[na] = {2*i for i in 1:na};
final parameter Real b[nb] = {3*i for i in 1:nb};
Real c[na];
Real d[na,nb];
protected
function myFun
input Real A;
input Real B;
output Real C;
algorithm
C:=tanh(A)*sin(B);
end myFun;
equation
c = sin(a);
//d = myFun(a,b);
// inner loop first
d = {myFun(a[i], b[j]) for j in 1:nb, i in 1:na};
end VectorizeDemo;
这将在 Dymola 中编译和模拟,但是查看dsmodel.c
每个数组元素中的 C 代码都被声明为一个新变量:
...
DeclareVariable("d[4, 10]", "", 38.0, 0.0,0.0,0.0,0,513)
DeclareVariable("d[5, 1]", "", 13.0, 0.0,0.0,0.0,0,513)
DeclareVariable("d[5, 2]", "", 16.0, 0.0,0.0,0.0,0,513)
DeclareVariable("d[5, 3]", "", 19.0, 0.0,0.0,0.0,0,513)
...
因此,如果我通过设置增加数组大小,na=1000
我将声明 1000*2000 个变量。显示的示例仍然可以编译,即使它需要很长时间,但我更复杂的用例使用编译器warning C4049: compiler limit, terminating line number emission
或使用C1002 compiler is out of heap space
.
旁注:较大的示例也需要几分钟的时间来检查,并且在模拟之后,当在变量浏览器中展开变量时,GUI 将被阻塞很长时间。
是否有任何解决方法,例如重写我的代码或设置一些标志?临时增加堆空间?我只需要运行一次模型。对正在发生的事情的任何见解也将不胜感激。使用 Dymola 2020 和 VisualStudio 2017。
解决方案
是的,至少在 Dymola 2020(可能还有更早的版本)中可以初步避免编译问题如下:
Real d[na,nb] annotation(__Dymola_HideArray=true);
但是,也可能存在其他可能性 - 该示例并未完全阐明其预期用途。特别是我注意到'd'可以被评估并且根本不被使用。
推荐阅读
- mysql - ORDER BY CASE WHEN 的问题,错误的行位置
- uwp-xaml - UWP - AppShell.xmal - MUXC:NavigationViewItem - 可用图标列表(非服装制作)
- laravel - 从关系和子关系中获取条目
- angular - 为什么 Angular ActivatedRoute 会发生这种情况?
- clojure - 需要 Clojure 中任意数字的前 10 个倍数
- c++ - 为什么在 C++17 上这个派生类可以用 `{}` 而不能用 `()` 构造?
- java - 如何避免 ValidatorException: PKIX path building failed 异常在 Intelij 中?
- excel - 在 Excel 宏上使用变量设置图表系列名称
- python - 在 Python SDK 中使用 SqlTransform 本地测试 Apache Beam。我收到一条错误消息:“'[%s] 的执行未在运行器 %s 中实现。'
- mule - Mule HTTP 响应超时