【问题标题】:Linking IndepVarComps from two Groups in OpenMDAO 1.x在 OpenMDAO 1.x 中链接来自两个组的 IndepVarComps
【发布时间】:2018-01-30 16:08:58
【问题描述】:

我不明白错误:

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 变量跨多个组链接在一起会很有帮助。

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

【问题讨论】:

    标签: python openmdao


    【解决方案1】:

    在组'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'])
    

    我建议删除 IndepVarComp 并在“AB”内部向下连接以解决此问题。

    更清楚地说,您不能同时将一个组件输入连接到最多 2 个不同的源。如果这两个来源有 2 个不同的值,那么哪一个是正确的?它是模棱两可的,所以我们不允许它。

    【讨论】:

    • 感谢您的回答和建议。我曾假设 IndepVarComp AB.x 可以由主控 ABC.x 驱动,但我现在明白这是不可能的。我可以看到几个不同的选项来继续。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多