如何缓存OpenMDAO组件输出以避免组件重复执行计算?
实现子系统仅单次调用的两种方案
针对你提出的单次run_model执行周期内仅运行一次、每次run_driver调用时也仅运行一次的需求,可通过以下两种方案实现:
方案1:自定义运行状态标记(通用无依赖)
不需要依赖框架特定API,兼容性强,支持灵活的执行控制逻辑。
核心思路是在子系统内新增运行状态标记,compute方法执行前先检查标记状态,已执行过则直接跳过。
import numpy as np import openmdao.api as om class StaticDataGen(om.ExplicitComponent): def initialize(self): # 初始化运行状态标记 self._has_computed = False def setup(self): # 按你的实际需求定义输入输出 self.add_input('base_param', val=1.0) self.add_output('shared_data', shape=(20,)) def compute(self, inputs, outputs): # 已完成计算则直接返回,不执行后续逻辑 if self._has_computed: return # 你的数据生成逻辑 outputs['shared_data'] = inputs['base_param'] * np.linspace(0, 100, 20) # 标记为已执行,后续调用直接跳过 self._has_computed = True if __name__ == "__main__": prob = om.Problem() # 添加第一个子系统:静态数据生成模块 prob.model.add_subsystem('data_gen', StaticDataGen(), promotes=['*']) # 此处添加剩余4个业务子系统... prob.setup() # 第一次调用run_driver prob.run_driver() # 子系统compute仅执行1次后锁定 # 第二次调用run_driver前先重置标记 prob.model.data_gen._has_computed = False prob.run_driver() # 子系统重新执行1次后再次锁定
方案2:使用OpenMDAO原生输出缓存(代码更简洁)
如果你的子系统输入在单次run_driver周期内不会发生变化,可以直接使用框架自带的输出缓存能力,无需手动写状态判断逻辑。
import numpy as np import openmdao.api as om class StaticDataGen(om.ExplicitComponent): def initialize(self): # 开启输出缓存,输入无变化时框架会自动跳过compute调用 self.options.declare('cache_outputs', default=True) def setup(self): self.add_input('base_param', val=1.0) self.add_output('shared_data', shape=(20,)) def compute(self, inputs, outputs): outputs['shared_data'] = inputs['base_param'] * np.linspace(0, 100, 20)
方案选择建议
- 若需要自定义执行控制规则(比如特定触发条件下才重新计算),或者要求每次调用
run_driver都必须重新执行一次(无论输入是否变化),优先选择方案1,手动重置标记即可触发重新计算 - 若仅需在输入不变时跳过重复计算,选择方案2,代码维护成本更低
内容的提问来源于stack exchange,提问作者tufan
相关产品推荐
相关产品推荐

