簡體   English   中英

在 Dymola 中編譯大數組

[英]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 emissionC1002 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM