在OpenMDAO的ExecComp中,shape_by_conn与has_diag_partials兼容吗?



我有一个om.ExecComp执行一个简单的操作:

"d_sq = x**2 + y**2"

,其中x,y,d_sq总是1Dnp.arrays。我希望能够在大型数组中使用它,而不需要分配一个大的密集矩阵。我还希望根据连接的形状配置数组的长度。但是,如果我指定x={"shape_by_conn": True}而不是x={"shape":100000},即使我也有has_diag_partials=True,它也会尝试分配一个100000^2的数组。是否有办法使这两个选项兼容?

首先,我要注意到您使用ExecComp有点超出了其设计目的。这并不是说你是完全无效的,但一般来说,ExecComp是为小型、廉价的计算而设计的。给它传递大数组不是我们测试的对象。

话虽如此,我认为你想要的会起作用。当您在此使用shape_by_conn时,您需要确保设置输入和输出的大小。我已经提供了一个示例,以及一个手动定义的组件,它可以做同样的事情。因为你的方程很简单,这将是更快的整体。

import numpy as np
import openmdao.api as om
class SparseCalc(om.ExplicitComponent): 

def setup(self): 
self.add_input('x', shape_by_conn=True)
self.add_input('y', shape_by_conn=True)
self.add_output('d_sq', shape_by_conn=True, copy_shape='x')
def setup_partials(self): 
# when using shape_by_conn, you need to delcare partials 
# in this secondary method
md = self.get_io_metadata(iotypes='input')
# everything should be the same shape, so just need this one
x_shape = md['x']['shape']
row_col = np.arange(x_shape[0])
self.declare_partials('d_sq', 'x', rows=row_col, cols=row_col)
self.declare_partials('d_sq', 'y', rows=row_col, cols=row_col)
def compute(self, inputs, outputs): 
outputs['d_sq'] = inputs['x']**2 + inputs['y']**2
def compute_partials(self, inputs, J): 
J['d_sq', 'x'] = 2*inputs['x']
J['d_sq', 'y'] = 2*inputs['y']

if __name__ == "__main__": 
p = om.Problem()
# use IVC here, because you have to have something connected to 
# in order to use shape_by_conn. Normally IVC is not needed
ivc = p.model.add_subsystem('ivc', om.IndepVarComp(), promotes=['*'])
ivc.add_output('x', 3*np.ones(10))
ivc.add_output('y', 2*np.ones(10))
# p.model.add_subsystem('sparse_calc', SparseCalc(), promotes=['*'])
p.model.add_subsystem('sparse_exec_calc', 
om.ExecComp('d_sq = x**2 + y**2', 
x={'shape_by_conn':True}, 
y={'shape_by_conn':True}, 
d_sq={'shape_by_conn':True, 
'copy_shape':'x'},
has_diag_partials=True), 
promotes=['*'])

p.setup(force_alloc_complex=True)
p.run_model()

如果您仍然发现这没有像预期的那样工作,请随意提交一个带有测试用例的错误报告,清楚地显示问题(即会引发您所看到的错误)。在这种情况下,提供的手动组件可以作为解决方案。

相关内容

最新更新