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__
方法。相反,我们建议您依赖 initialize
和 setup
方法。 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远程刀补三菱机床在线刀补三菱数控在线测量