我有两个组件comp1和comp2形成一个问题,应该运行几次。为此,我发现我可以使用UniformDriver(我不知道这是否适合我的目的)。但是,我想将comp2的输出反馈到comp1中。所以在第一次运行之后,我从comp2获得一个输出,对于下一次运行,它应该是comp1的输入。我认为以下示例使我更清楚我想做什么:
from openmdao.api import Component, Group, Problem, UniformDriver
class Times2Plus(Component):
def __init__(self):
super(Times2Plus, self).__init__()
self.add_param('x', 1.0)
self.add_param('z', 2.0)
self.add_output('y', shape=1)
def solve_nonlinear(self, params, unknowns, resids):
unknowns['y'] = params['x'] * 2.0 + params['z']
class Power3(Component):
def __init__(self):
super(Power3, self).__init__()
self.add_param('y', shape=1)
self.add_output('x', shape=1) # feedback to params['x'] as input in next run
def solve_nonlinear(self, params, unknowns, resids):
unknowns['x'] = params['y'] ** 3.0
prob = Problem(root=Group())
prob.driver = UniformDriver(num_samples=5)
prob.root.add('comp1', Times2Plus())
prob.root.add('comp2', Power3())
prob.root.connect('comp1.y', 'comp2.y')
prob.setup()
prob.run()
基本上,前一次运行的组件Power3的输出x应连接到组件Times2Plus的输入x。另外我有一些参数z,我事先知道,对于每次运行都不同的组件Times2Plus。包含此更改参数和反馈选项的最佳方法是什么?
答案 0 :(得分:0)
在这种情况下,您不需要驱动器。你在谈论解算器(与OpenMDAO中的驱动程序不同> 1.0)。
您可以使用Non Linear Gauss Seidel查看如何在我们的Sellar示例中设置此类内容的示例。基本上,您只需要以循环方式连接组件,然后添加适当的求解器以确保它们是收敛的。