从 OpenMDAO 中的两个组链接 IndepVarComps 1.x
Linking IndepVarComps from two Groups in OpenMDAO 1.x
不明白错误:
NameError: Source 'x' cannot be connected to target 'AB.x': Target must be a parameter but 'AB.x' is an unknown.
我已经通读了这个 ,但仍然缺少一些东西。
我写了一个简单的问题来更容易捕捉问题:
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()
与通过 promotes
使用隐式连接相比,我更喜欢使用 linking 组件变量的 IndepVarComp
方法和显式 connect
语句,因为我可以更多轻松查看大问题中的联系,并列出所有输入变量。当我构建越来越大的问题时,link 跨多个组将两个 IndepVarComp 变量放在一起会很有帮助。
非常感谢您的想法和时间。
在组 'AB' 中,提升的变量 'x' 已经连接到源:
self.add('x', IndepVarComp('x', val=0.0), promotes=['*'])
self.connect('x', ['A.x', 'B.x'])
在顶部组 'ABC' 中,同一个 'x' 变量是 'AB.x',但您尝试将它再次连接到另一个独立变量组件:
self.add('x', IndepVarComp('x', val=0.0), promotes=['*'])
self.connect('x', ['AB.x', 'C.x'])
我建议删除 'AB' 内部的 IndepVarComp 和连接以解决此问题。
更清楚地说,您不能同时连接多达 2 个不同来源的分量输入。如果这两个来源有 2 个不同的值,那么哪个是正确的?有歧义,所以我们不允许。
不明白错误:
NameError: Source 'x' cannot be connected to target 'AB.x': Target must be a parameter but 'AB.x' is an unknown.
我已经通读了这个
我写了一个简单的问题来更容易捕捉问题:
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()
与通过 promotes
使用隐式连接相比,我更喜欢使用 linking 组件变量的 IndepVarComp
方法和显式 connect
语句,因为我可以更多轻松查看大问题中的联系,并列出所有输入变量。当我构建越来越大的问题时,link 跨多个组将两个 IndepVarComp 变量放在一起会很有帮助。
非常感谢您的想法和时间。
在组 'AB' 中,提升的变量 'x' 已经连接到源:
self.add('x', IndepVarComp('x', val=0.0), promotes=['*'])
self.connect('x', ['A.x', 'B.x'])
在顶部组 'ABC' 中,同一个 'x' 变量是 'AB.x',但您尝试将它再次连接到另一个独立变量组件:
self.add('x', IndepVarComp('x', val=0.0), promotes=['*'])
self.connect('x', ['AB.x', 'C.x'])
我建议删除 'AB' 内部的 IndepVarComp 和连接以解决此问题。
更清楚地说,您不能同时连接多达 2 个不同来源的分量输入。如果这两个来源有 2 个不同的值,那么哪个是正确的?有歧义,所以我们不允许。