[英]Compile large array in 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' 可以被評估並且根本不使用。
默認情況下,所有 Modelica 編譯器都會將所有數組(有一些例外,例如函數中記錄中的數組)擴展為標量。 OpenModelica 在前端和后端開始了一些非擴展數組的工作。 參見: http : //www.ep.liu.se/ecp/157/071/ecp19157071.pdf
IIRC,Modelica 規范的某些部分是以需要對所有變量進行標量化的方式編寫的。 這在很多情況下不是必需的,但對於索引縮減中的一些常見情況來說更簡單。 對於離散化 PDE 的某些情況,這似乎特別不必要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.