【发布时间】:2016-02-02 21:01:35
【问题描述】:
我想知道拆分连接命令的最佳方法。我有两个想要模块化的组,一个内部组和一个外部组。我希望内部组是一种黑盒子,我可以在其中切换或更改内部组,而无需更改外部组的所有连接。我只希望外部组必须知道内部组的输入和输出。举个例子:
import numpy as np
from openmdao.api import Group, Problem, Component, IndepVarComp, ExecComp
class C(Component):
def __init__(self, n):
super(C, self).__init__()
self.add_param('array_element', shape=1)
self.add_output('new_element', shape=1)
def solve_nonlinear(self, params, unknowns, resids):
unknowns['new_element'] = params['array_element']*2.0
class MUX(Component):
def __init__(self, n):
super(MUX, self).__init__()
for i in range(n):
self.add_param('new_element' + str(i), shape=1)
self.add_output('new_array', shape=n)
self.n = n
def solve_nonlinear(self, params, unknowns, resids):
new_array = np.zeros(n)
for i in range(n):
new_array[i] = params['new_element' + str(i)]
unknowns['new_array'] = new_array
class GroupInner(Group):
def __init__(self, n):
super(GroupInner, self).__init__()
for i in range(n):
self.add('c'+str(i), C(n))
self.connect('array', 'c'+str(i) + '.array_element', src_indices=[i])
self.connect('c'+str(i)+'.new_element', 'new_element'+str(i))
self.add('mux', MUX(n), promotes=['*'])
class GroupOuter(Group):
def __init__(self, n):
super(GroupOuter, self).__init__()
self.add('array', IndepVarComp('array', np.zeros(n)), promotes=['*'])
self.add('inner', GroupInner(n), promotes=['new_array'])
for i in range(n):
# self.connect('array', 'inner.c'+str(i) + '.array_element', src_indices=[i])
self.connect('array', 'inner.array', src_indices=[i])
n = 3
p = Problem()
p.root = GroupOuter(n)
p.setup(check=False)
p['array'] = np.ones(n)
p.run()
print p['new_array']
当我运行代码时,我收到以下错误:
NameError: Source 'array' cannot be connected to target 'c0.array_element': 'array' does not exist.
为了解决这个问题,我在 GroupInner 组中创建了一个 IndepVarComp 'array'。但是,当我这样做时,我得到了错误:
NameError: Source 'array' cannot be connected to target 'inner.array': Target must be a parameter but 'inner.array' is an unknown.
我知道,如果我只是建立完整的连接: self.connect('array', 'inner.c'+str(i) + '.array_element', src_indices=[i]) 那么它将起作用。但就像我说的,我希望 GroupInner 成为一个黑盒子,我不知道里面有哪些组或组件。我也不能只推广所有,因为 array_elements 是不同的。是否可以这样做,还是必须在一个命令中完成整个连接?
【问题讨论】:
标签: openmdao