您在这里有几个选项,并根据您为什么重复调用A1和A2的细节,我建议更改哪一个。
我几乎总是建议将更大的模型分成更小的组件,因为它使计算分析派生更容易,并提供更多的模块化代码库。假设你确实打破了A,重复呼叫的特征是什么?
A1和A2是否需要在多个不同的操作点重复进行某种分析?例如多重载荷情况或空气动力学强迫?也许你平均在他们之间计算A的最终输出?如果是这样的话,我会建议将A1和A2作为向量化函数来写入,这些向量函数可以接收输入数据的数组(数组的每个条目代表不同的点),然后输出一个数组,并在每个元素上完成计算。以这种方式使用numpy数组既快又有效地利用OpenMDAO中的内存。这绝对是我如何建议你处理你最后一个问题,关于重复运行不同的输入。如果你不能对函数进行矢量化,那么相反,你可以删除你的模型的多个实例(每个输入实例一个实例),但是取决于你有多少个输入实例可能效率较低。
您是否正在通过A1/A2迭代某种收敛过程?如果是这样,你应该使用求解器来处理这种循环。 GaussSeidel或牛顿应该这样做。如果你的规则由某种启发式迭代构成以达到收敛,那么你可以将它编码到自定义解算器中,但对于新手用户来说这肯定会有些困难。相反,如果您的规则相当于某种算法,您以某种固定顺序执行A1/A2并按固定次数调用每个算法,我会回到我的建议,即您只是实例化A1和A2的多个副本,然后将它们连接起来一起为你的问题制作你想要的序列。
谢谢,贾斯汀。这确实会起作用,尽管案例的数量取决于问题的实例化和独立变量的解决。我会看看是否可以自动实例化并连接组件A1和A2的N个副本。再次感谢。 –
这工作。我还有一个问题,在n个案例中运行相同的组件,哪种方式更容易(以及如何)并行化,n个组件的实例化或向量化? –
我的意思是尴尬平行的情况 –