OpenMDAO 中所有子系统的公共变量

Posted

技术标签:

【中文标题】OpenMDAO 中所有子系统的公共变量【英文标题】:Common variables for all subsystems in OpenMDAO 【发布时间】:2021-12-30 05:45:37 【问题描述】:

我正在尝试构建一个框架,该框架首先读取包含一些键和相应值的输入文件。然后我相应地更新变量:

from Inertia import Inertia
...  

d = hf.read_input(fin)
locals().update(d)

然后,我定义组 MDA:

class MDA(om.Group):

    class ObjCmp(om.ExplicitComponent):
        
        def setup(self):
            ...

        def setup_partials(self):
            ...

        def compute(self, inputs, outputs):
            ...

        def setup(self):
            ...

其中包含两个子系统(目前):

self.add_subsystem('d1', SomeModule(), promotes_inputs=['x1','x2'],
                        promotes_outputs=['y1','y2'])

self.add_subsystem('obj_cmp', self.ObjCmp(), promotes_inputs=['y1'],
                        promotes_outputs=['obj'])

出于内部管理的原因,由于框架最终将包含大量子系统,我想将定义特定子系统的类保留在单独的脚本中,导入主脚本(定义 Group 的脚本)。

我面临的问题是,如果我只在定义 Group 的脚本级别读取输入文件一次(在进入 Group() 类之前),那么以这种方式检索的变量不会在例如,较低的级别,我不能在 SomeModule() 中使用它们。我通常会在 SomeModule() 中定义一个 init() 方法,以便能够传递一些变量:

def __init__(self, d):
    self.d = d

但是由于我们在 self.add_subsystem() 中实例化了 SomeModule() 类,所以它不起作用。

如果有任何提示,我将不胜感激。

【问题讨论】:

【参考方案1】:

在 OpenMDAO 中,我们以两种方式处理这个实例化时间问题:

    我们强烈反对对组件或组使用__init__ 方法。相反,我们建议您依赖 initializesetup 方法。 initialize 在现有的 __init__ 内部被调用(即在实例化时)。 setup 在模型层次结构的构建过程中被调用很晚。

我们确实提供了一种通过options system 创建初始化参数的方法。选项允许一些内置验证,如果您愿意,还可以让您稍后更改值。

    尽可能延迟到setup,如果可以的话。将您的配置文件(或根据您的喜好构建的对象)作为 option 传递到您的组件中,但在设置之前不要实际使用它。

这适用于组件和组。您可以在您的组的所有级别使配置数据成为一个选项。他们每个人都会在自己的设置方法中将对象传递给他们的孩子。这样,您只需要在初始化***组时让对象存在。然后它将它传递给它的所有子代。

【讨论】:

感谢您的回复,非常感谢!我修改了代码: - 最初:读取输入文件,将其保存到 dict 对象 d,而不更新本地 - 在组级别:添加了带有“inp_data”选项声明的 initialize() 方法,并将该选项传递给 SomeClass( ) 在 setup 方法中 (SomeClass(inp_data=d)) - 在组件级别:添加了 initialize() 方法,并且在 compute() 方法中,传递了选项的值 (self.options['inp_data'])到一个新的变量,从那时起使用。请您确认这是否是正确的方法,或者可以进一步简化。 听起来基本正确,只是您不应该在compute 中向下传递选项数据。您应该改用setup 方法。 谢谢@JustinGray!

以上是关于OpenMDAO 中所有子系统的公共变量的主要内容,如果未能解决你的问题,请参考以下文章

三菱M70宏变量读取三菱M80公共变量采集三菱CNC变量读取采集三菱CNC远程刀补三菱机床在线刀补三菱数控在线测量

公共静态变量和Android活动生命周期管理

XML文件系统

声明一个公共变量会导致所有内容都具有“此上下文中不存在名称”错误[关闭]

5G核心网技术基础自学系列 | 公共预警系统

代码规范