具有相同输入的隐式和显式组件

时间:2018-02-15 14:18:34

标签: openmdao

如果考虑到相同的输入,如何在同一个组件中定义隐式和显式输出?

我尝试使用隐式组件来执行此操作,就像这样。

class Dis(ImplicitComponent):

def setup(self):
    self.add_input('a')
    self.add_input('b')
    self.add_input('c')
    self.add_output('z')

    self.add_output('y1')
    self.add_output('y2')
    self.add_output('y3')

    self.declare_partials(of='*', wrt='*', method='fd')

def apply_nonlinear(self, inputs, outputs, residuals):

    residuals['z'] = (1 - outputs['z']) / (inputs['a']) ** 0.5 * inputs['b'] - inputs['c']

def solve_nonlinear(self, inputs, outputs):

    outputs['y1'] = (1 - outputs['z']) / (inputs['a']) ** 0.5 * inputs['b']
    outputs['y2'] = inputs['a'] * (0.01 * outputs['z'] + 1)
    outputs['y3'] = inputs['b'] * (outputs['y2'] / inputs['a'])

所以,在同一个学科中,我需要z来改变以满足剩余等式,我需要它来计算其余的y1y2y3我的系统。

然而,OpenMDAO认为所有输出都是隐式输出,因此我后来在我的系统中使用的DirectSolver有一个“奇异矩阵”问题。为了解决这个问题,我创建了一个由两个组件组成的组:一个是直接依赖于输入的变量,另一个是隐式变量,它使用相同的输入,就像这样。

class Dis1(ImplicitComponent):

def setup(self):

    self.add_input('a')
    self.add_input('b')
    self.add_input('c')
    self.add_output('z')

    self.declare_partials(of='*', wrt='*', method='fd')

def apply_nonlinear(self, inputs, outputs, residuals):

    residuals['z'] = (1 - inputs['z']) / (inputs['a']) ** 0.5 * inputs['b'] - inputs['c']

class Dis2(ExplicitComponent):
def setup(self):

    self.add_input('a')
    self.add_input('b')
    self.add_input('c')

    self.add_input('z')

    self.add_output('y1')
    self.add_output('y2')
    self.add_output('y3')

    self.declare_partials(of='*', wrt='*', method='fd')

def compute(self, inputs, outputs):

    outputs['y1'] = (1 - inputs['z']) / (inputs['a']) ** 0.5 * inputs['b']

    outputs['y2'] = inputs['a'] * (0.01 * inputs['z'] + 1)
    outputs['y3'] = inputs['b'] * (outputs['y2'] / inputs['a'])

class Top(Group):
def setup(self):

    self.add_subsystem('compz', Dis1())
    self.add_subsystem('comp_exp', Dis2(), promotes_outputs=['y1', 'y2', 'y3'])

    self.connect('compz.z', 'comp_exp.z')

    self.set_order(['compz', 'comp_ex'])

有没有办法将它们放在一个组件中?我的意思是一个能够计算残差并给出明确输出的组件。

0 个答案:

没有答案