在组内的组件内更新 IndepVarComp

Updating IndepVarComp within a component inside the group

由于我缺乏知识,这可能是一个问题 python 但我想 add_output 从一个组件中 add_output indepvarcomp(已在问题或组级别启动)在层次结构中是低一级。示例代码可以是这样的(见下文)并查看无法识别变量的连接。可以这样做吗?

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()

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

我不明白为什么 child 组件需要在 parent 级别创建变量。在 OpenMDAO 中,children 故意不知道他们的 parents 的任何信息。我们非常严格地在框架代码的内部和模型本身中强制执行这一点。

如果您需要在层次结构的某个较低级别添加一个新的独立变量(这肯定会发生),那么我建议您在该较低级别创建一个组并创建一个新的 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()

我遵循了您的命名约定,为了清楚起见,我在 sub-group 中创建了一个 second IndepVarComp,但名称仍然相同。这里加个N2,让模型结构清晰。