更新组内组件内的IndepVarComp

时间:2018-11-02 08:50:33

标签: openmdao

这可能是一个问题,因为我缺乏python知识,但是我想从层次结构中下一层的组件中向indepvarcomp(已在问题或组级别启动)添加_output。示例代码可以是类似这样的代码(请参阅下文),并查看无法识别变量的连接。可以这样做吗?

from openmdao.api import Problem, ScipyOptimizeDriver, IndepVarComp,Group,ExplicitComponent

class SellarDis2(ExplicitComponent):
    from openmdao.core.indepvarcomp import IndepVarComp

    def initialize(self):
        self.options.declare('indeps', types=IndepVarComp)

    def setup(self):

        indeps=self.options['indeps']
        indeps.add_output('try', 1.0)
        self.add_input('try', val=2)
        self.add_input('z', val=2)

        self.add_output('y2',  val=5.0)

    def compute(self, inputs, outputs):
        outputs['y2'] = inputs['z']*2+inputs['try']


class SellarMDA(Group):

    def setup(self):
        indeps = self.add_subsystem('indeps', IndepVarComp(), promotes=['*'])
        indeps.add_output('z', 1.0)

        self.add_subsystem('d2', SellarDis2(indeps=indeps), promotes=['*'])



prob = Problem()
prob.model = SellarMDA()

prob.driver = ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'COBYLA'
# prob.driver.options['maxiter'] = 100
prob.driver.options['tol'] = 1e-8

prob.model.add_design_var('z', lower=0, upper=10)
#prob.model.add_objective('obj')


prob.setup()


prob.run_model()

1 个答案:

答案 0 :(得分:0)

如您所说,提供的脚本不起作用。我以为我同意,从理论上讲,这似乎应该可行,并且是一个小错误,我也不认为您实际上应该以这种方式构建模型。

我不明白为什么子组件需要在父级别创建变量。在OpenMDAO中,孩子对设计的父母一无所知。我们在框架代码的内部和模型本身中强制执行严格。

如果您需要在层次结构的某个较低级别上添加一个新的自变量(这确实会发生),那么我建议您在该较低级别上创建一个组,并创建一个新的IndepVarComp来容纳新变量。这是脚本的编辑版本,其中包括我建议您处理情况的方式。

from openmdao.api import Problem, ScipyOptimizeDriver, IndepVarComp, Group, ExplicitComponent

class SellarDis2(ExplicitComponent):


    def setup(self):

        self.add_input('try', val=2)
        self.add_input('z', val=2)

        self.add_output('y2',  val=5.0)

    def compute(self, inputs, outputs):
        outputs['y2'] = inputs['z']*2+inputs['try']


class SubGroup(Group):

    def setup(self):
        indeps = self.add_subsystem('indeps', IndepVarComp(), promotes=['*'])
        indeps.add_output('try', 1.0)
        self.add_subsystem('d2', SellarDis2(), promotes=['*'])

class SellarMDA(Group):

    def setup(self):
        indeps = self.add_subsystem('indeps', IndepVarComp(), promotes=['*'])
        indeps.add_output('z', 1.0)

        self.add_subsystem('d2', SubGroup(), promotes=['*'])



prob = Problem()
prob.model = SellarMDA()

prob.driver = ScipyOptimizeDriver()
prob.driver.options['optimizer'] = 'COBYLA'
# prob.driver.options['maxiter'] = 100
prob.driver.options['tol'] = 1e-8

prob.model.add_design_var('z', lower=0, upper=10)
#prob.model.add_objective('obj')


prob.setup()
prob.final_setup()


prob.run_model()

我遵循了您的命名约定,为清楚起见,我在子组中创建了一个 second IndepVarComp,但仍使用相同的名称。这是一个N2,以使模型结构更清晰。 N2 diagram of example model