如何获取Auto-IVC组件的已提升输出名称列表
Auto-IVC已提升输出名称获取方案
问题根因
你调用p.model._auto_ivc.list_outputs()返回空列表的核心原因是调用时机早于模型初始化完成节点,此时Auto-IVC组件的输出变量还未完成注册挂载。此外不建议直接操作_auto_ivc这类以下划线开头的私有属性,OpenMDAO版本迭代时私有接口没有兼容性保障,容易引发代码故障。
实现方案
方案1:主动获取已提升输出列表
按如下流程操作即可拿到完整的Auto-IVC已提升输出名称:
- 完成模型定义、变量提升逻辑后,调用
p.setup()完成基础设置 - 调用
p.final_setup()触发完整的变量校验、连接、初始化流程,此时所有Auto-IVC变量已完成注册 - 用以下代码过滤得到所有提升到模型顶层的Auto-IVC输出名:
auto_ivc_promoted_names = [ meta["prom_name"] for _, meta in p.model.list_outputs(prom_name=True, includes="_auto_ivc.*") ]
你可以直接遍历该列表,从配置文件读取对应数值后调用p.set_val(var_name, config_value)完成赋值。
方案2:无需提前获取列表,直接批量赋值(更简便)
如果你的配置文件Key与模型顶层提升的变量名完全一致,完全不需要提前查询Auto-IVC的输出列表,直接遍历配置文件的键值对,逐一调用p.set_val(key, value)即可,OpenMDAO会自动匹配顶层提升名,将数值写入对应的Auto-IVC变量,无需感知底层Auto-IVC组件的存在。
注意事项
- 不要在
p.setup()执行前查询任何组件的输入输出列表,此时变量提升、连接逻辑还未计算完成,返回结果不符合预期 - 如果你不需要修改Auto-IVC的默认值,不需要手动操作该组件,OpenMDAO会自动根据你定义的输入默认值完成初始化
内容的提问来源于stack exchange,提问作者Mark Garnett
相关产品推荐
相关产品推荐

