在OpenMDAO 1.x中链接来自两个组的IndepVarComps

时间:2018-01-30 16:08:59

标签: python openmdao

我不明白错误:

NameError: Source 'x' cannot be connected to target 'AB.x': Target must be a parameter but 'AB.x' is an unknown.

我已阅读此response,但仍遗漏了一些内容。

我写了一个简单的问题,以便更容易地捕捉到这个问题:

from openmdao.api import Group, Component, IndepVarComp, Problem

class A(Component):
    def __init__(self):
        super(A, self).__init__()
        self.add_param('x', val=0.0)
        self.add_param('y', val=0.0)
        self.add_output('z', val=0.0)
    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['z'] = params['x'] + params['y']

class B(Component):
    def __init__(self):
        super(B, self).__init__()
        self.add_param('x', val=0.0)
        self.add_param('y', val=0.0)
        self.add_output('z', val=0.0)
    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['z'] = 2*params['x'] - params['y']

class AB(Group):
    def __init__(self):
        super(AB, self).__init__()
        self.add('A', A())
        self.add('B', B())
        self.add('x', IndepVarComp('x', val=0.0), promotes=['*'])
        self.add('y', IndepVarComp('y', val=0.0), promotes=['*'])
        self.connect('x', ['A.x', 'B.x'])
        self.connect('y', ['A.y', 'B.y'])

class C(Component):
    def __init__(self):
        super(C, self).__init__()
        self.add_param('x', val=0.0)
        self.add_param('y', val=0.0)
        self.add_output('z', val=0.0)
    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['z'] = 3*params['x'] - 2*params['y']

class ABC(Group):
    def __init__(self):
        super(ABC, self).__init__()
        self.add('AB', AB())
        self.add('C', C())
        self.add('x', IndepVarComp('x', val=0.0), promotes=['*'])
        self.add('y', IndepVarComp('y', val=0.0), promotes=['*'])
        self.connect('x', ['AB.x', 'C.x'])
        self.connect('y', ['AB.y', 'C.y'])

prob = Problem()
prob.root = ABC()
prob.setup()
prob.run()

我更喜欢使用IndepVarComp方法将组件变量与显式connect语句链接起来,而不是通过promotes使用隐式连接,因为我可以更容易地看到大问题中的连接并有一个很好的所有输入变量列表。当我构建越来越大的问题时,将两个IndepVarComp变量链接在多个组中会很有帮助。

非常感谢您的想法和时间。

1 个答案:

答案 0 :(得分:2)

在小组' AB'中,推广变量' x'已连接到来源:

    self.add('x', IndepVarComp('x', val=0.0), promotes=['*'])
    self.connect('x', ['A.x', 'B.x'])

在顶级组' ABC',同样的' x'变量是' AB.x',但您尝试将其再次连接到另一个indepvarcomp:

    self.add('x', IndepVarComp('x', val=0.0), promotes=['*'])
    self.connect('x', ['AB.x', 'C.x'])

我建议在' AB'内部删除IndepVarComp和连接。解决这个问题。

更清楚的是,您无法同时连接最多2个不同来源的组件输入。如果这两个来源有两个不同的值,那么哪一个是正确的?它含糊不清,所以我们不允许这样做。