我有一个复杂的模型(A),可以很容易地写入带有输入和输出的单个组件。然而,在模型A中,反复调用两个“物理”学科A1和A2。 我想将模型A分成两个子组件(A1和A2),并根据一些规则使用调用A1和A2的代码。 问题是,我应该将这个“胶水代码”编写为调用其中其他组件的组件吗?或者我应该编写自己的“驱动程序”,用我的规则调用A1和A2? 或者我必须将大型模型保存在一个单独的组件中吗?
另一个类似的情况是,必须在不同情况下(输入值)评估(理想情况下)单个组件。怎么反复打电话?或者使一个组件在compute方法中循环? 感谢。
答案 0 :(得分:2)
这里有几个选项,根据您重复调用A1和A2的原因,我推荐哪一个会改变。
我几乎总是建议将更大的模型分解为更小的组件,因为它使计算分析衍生产品更容易,并提供更模块化的代码库。假设你确实打破了A,重复呼叫的特征是什么?
A1和A2是否需要在多个不同的操作点重复某种分析?例如多个载荷情况或空气动力学情况?也许你在它们之间平均计算一些A的最终输出?如果是这样,我建议将A1和A2写为矢量化函数,它可以接收输入数据的数组(数组的每个条目代表不同的点),然后输出一个数组,并对每个元素进行计算。以这种方式使用numpy数组既可以快速又有效地使用OpenMDAO中的内存。这绝对是我建议你处理你的最后一个问题,关于不同输入重复运行。如果您无法对函数进行矢量化,那么您可以标记模型的多个实例(每个输入案例一个),但根据您拥有的输入案例数量,这可能效率较低。
您是否正在迭代A1 / A2以进行某种收敛过程?如果是这样,你应该使用求解器来处理这种循环。高斯赛德尔或牛顿应该做到这一点。如果您的规则由某种启发式迭代组成以达到收敛,那么您可以将其编码到自定义求解器中,尽管对于新手用户来说肯定会有些困难。如果相反,你的规则相当于某种算法,你在某个固定序列中执行A1 / A2并且每次调用固定次数,我回到我的建议你只是实例化A1和A2的多个副本然后连接它们一起制作你想要的问题顺序。