2017-10-18 32 views
0

我有一個複雜的模型(A),可以很容易地將其寫入具有輸入和輸出的單個組件。但是,在模型A中,有兩個「物理」學科A1和A2重複調用。 我想將模型A分成兩個子組件(A1和A2),並有一個根據某些規則調用A1和A2的代碼。 問題是,我應該把這個「膠水代碼」寫成一個調用其中的組件嗎?或者我應該寫我自己的「驅動程序」,用我的規則調用A1和A2? 或者我必須將大型模型保存在單個組件中嗎?如何將複雜模型分解爲組件+自定義「驅動程序」?

另一個類似的情況是,必須在不同情況下(輸入值)評估(理想情況下)單個組件。如何重複調用它?或者讓一個組件在計算方法中循環? 謝謝。

回答

2

您在這裏有幾個選項,並根據您爲什麼重複調用A1和A2的細節,我建議更改哪一個。

我幾乎總是建議將更大的模型分成更小的組件,因爲它使計算分析派生更容易,並提供更多的模塊化代碼庫。假設你確實打破了A,重複呼叫的特徵是什麼?

A1和A2是否需要在多個不同的操作點重複進行某種分析?例如多重載荷情況或空氣動力學強迫?也許你平均在他們之間計算A的最終輸出?如果是這樣的話,我會建議將A1和A2作爲向量化函數來寫入,這些向量函數可以接收輸入數據的數組(數組的每個條目代表不同的點),然後輸出一個數組,並在每個元素上完成計算。以這種方式使用numpy數組既快又有效地利用OpenMDAO中的內存。這絕對是我如何建議你處理你最後一個問題,關於重複運行不同的輸入。如果你不能對函數進行矢量化,那麼相反,你可以刪除你的模型的多個實例(每個輸入實例一個實例),但是取決於你有多少個輸入實例可能效率較低。

您是否正在通過A1/A2迭代某種收斂過程?如果是這樣,你應該使用求解器來處理這種循環。 GaussSeidel或牛頓應該這樣做。如果你的規則由某種啓發式迭代構成以達到收斂,那麼你可以將它編碼到自定義解算器中,但對於新手用戶來說這肯定會有些困難。相反,如果您的規則相當於某種算法,您以某種固定順序執行A1/A2並按固定次數調用每個算法,我會回到我的建議,即您只是實例化A1和A2的多個副本,然後將它們連接起來一起爲你的問題製作你想要的序列。

+0

謝謝,賈斯汀。這確實會起作用,儘管案例的數量取決於問題的實例化和獨立變量的解決。我會看看是否可以自動實例化並連接組件A1和A2的N個副本。再次感謝。 –

+0

這工作。我還有一個問題,在n個案例中運行相同的組件,哪種方式更容易(以及如何)並行化,n個組件的實例化或向量化? –

+0

我的意思是尷尬平行的情況 –

相關問題