2017-10-18 38 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

我的意思是尴尬平行的情况 –

相关问题