我正在尝试使用黑盒求解器来计算 Dymos 中的 ODE 函数之一。例如,该组件将计算
x_dot = f(x)
,其中 f
是现有的基于物理的求解器,x
是大小为 N
的状态变量向量。
使用搭配时,
x
现在呈现 MxN
的形状,其中 M
是搭配节点的数量。问题是基于物理的求解器无法采用这种形状的输入。目前,我必须迭代 M
次才能按顺序计算每个搭配点上的 f(x)
。例如
def compute(self, inputs, outputs):
M = self.options['num_nodes']
x = inputs["x"]
x_dot = np.zeros((M, N))
for i in range(0, M):
x_dot[i] = f(x[i])
outputs["x_dot"] = x_dot
这显然计算效率低下,我正在寻找一种并行化此计算方法的方法。
Dymos 有支持的原生方法吗?仅供参考,我尝试使用多处理(池)但收到错误
TypeError: cannot pickle 'weakref' object
。
谢谢。
dymos 所基于的 OpenMDAO 通过 MPI 进行并行化,主要通过两种方式:
首先,您可以将多个组件放入ParallelGroup中。当代码通过
mpirun
运行时,每个组件都会同时执行。
然后,您可以将输出重新组合到单个数组中。
第二种更先进的方法是在单个组件中使用分布式输入和输出。当对其进行编码时,它似乎是单个组件,但 MPI 在不同处理器上提供该组件的副本,并在输入/输出数组中的不同元素上进行计算。这里有一些关于它如何工作的解释