连接到 OpenMDAO 2 中的输入变量切片?

Connect to an input variable slice in OpenMDAO 2?

我正在尝试将一个组件的较小输出变量连接到另一个组件中输入变量的特定片段。通过 src_indices 关键字可以进行相反的操作(将较大输出的一部分连接到较小的输入),如下例所示。

import numpy as np

import openmdao.api as om

p = om.Problem()

p.model.add_subsystem('C1', om.AddSubtractComp('y', 'x', vec_size=3,
                                               units=None, desc='', var_set=''))
p.model.add_subsystem('C2', om.AddSubtractComp('y', 'x', vec_size=2,
                                               units=None, desc='', var_set=''))

p.model.connect('C1.y', 'C2.x', src_indices=[0, 1])

p.setup()
p.run_model()

print(p['C2.y'])

但是,如果我想改为将 C2.y 连接到 C1.x[0:2] 怎么办?好像应该有一个"target indices"关键字来镜像src_indices,但是我没有找到任何东西。我试过这个:

p.model.connect('C2.y', 'C1.x', src_indices=[0, 1, 0])

它有效,但现在我已将 y[0] 连接到 x[2],这是不需要的。是否有可能做到这一点?

不幸的是,OpenMDAO 2 不支持将输出连接到输入的某些子集。作为解决方法,您可以创建一个 'adapter' 组件,该组件将较小的数组作为输入并输出较大的数组。例如:

import numpy as np

import openmdao.api as om

p = om.Problem()

p.model.add_subsystem('C2', om.AddSubtractComp('y', 'x', vec_size=2, units=None, desc=''))
p.model.add_subsystem('Adapter', om.ExecComp('y[:2]=x', x=np.zeros(2), y=np.zeros(3)))
p.model.add_subsystem('C1', om.AddSubtractComp('y', 'x', vec_size=3, units=None, desc=''))

p.model.connect('C2.y', 'Adapter.x')
p.model.connect('Adapter.y', 'C1.x')

p.setup()

p['C2.x'] = 5.

p.run_model()

print(p['C2.y'])
print(p['C1.y'])