您在這裏有幾個選項,並根據您爲什麼重複調用A1和A2的細節,我建議更改哪一個。
我幾乎總是建議將更大的模型分成更小的組件,因爲它使計算分析派生更容易,並提供更多的模塊化代碼庫。假設你確實打破了A,重複呼叫的特徵是什麼?
A1和A2是否需要在多個不同的操作點重複進行某種分析?例如多重載荷情況或空氣動力學強迫?也許你平均在他們之間計算A的最終輸出?如果是這樣的話,我會建議將A1和A2作爲向量化函數來寫入,這些向量函數可以接收輸入數據的數組(數組的每個條目代表不同的點),然後輸出一個數組,並在每個元素上完成計算。以這種方式使用numpy數組既快又有效地利用OpenMDAO中的內存。這絕對是我如何建議你處理你最後一個問題,關於重複運行不同的輸入。如果你不能對函數進行矢量化,那麼相反,你可以刪除你的模型的多個實例(每個輸入實例一個實例),但是取決於你有多少個輸入實例可能效率較低。
您是否正在通過A1/A2迭代某種收斂過程?如果是這樣,你應該使用求解器來處理這種循環。 GaussSeidel或牛頓應該這樣做。如果你的規則由某種啓發式迭代構成以達到收斂,那麼你可以將它編碼到自定義解算器中,但對於新手用戶來說這肯定會有些困難。相反,如果您的規則相當於某種算法,您以某種固定順序執行A1/A2並按固定次數調用每個算法,我會回到我的建議,即您只是實例化A1和A2的多個副本,然後將它們連接起來一起爲你的問題製作你想要的序列。
謝謝,賈斯汀。這確實會起作用,儘管案例的數量取決於問題的實例化和獨立變量的解決。我會看看是否可以自動實例化並連接組件A1和A2的N個副本。再次感謝。 –
這工作。我還有一個問題,在n個案例中運行相同的組件,哪種方式更容易(以及如何)並行化,n個組件的實例化或向量化? –
我的意思是尷尬平行的情況 –