src_indices 最佳实践

src_indices best practices

版本之后3.13 src_indices 已更改,我在文档中找不到它。您能否分享连接大型矩阵的较小部分的示例代码?

即源是 5x5 矩阵,目标是从 [2,3]

开始的 2x2

我发现将连接视为切片是最简单的。我们添加了 om.slicer 来通过切片符号处理索引。以下示例连接 5x5 矩阵的 2x2 部分,从索引 [2, 3] 开始:

import openmdao.api as om
import numpy as np

print('Connecting a 2x2 submatrix of M to B')

p = om.Problem()

ivc = p.model.add_subsystem('ivc', om.IndepVarComp())
ivc.add_output('M', val=np.arange(25).reshape((5, 5)))

exec = p.model.add_subsystem('exec', om.ExecComp())

exec.add_expr('A = B', A={'shape': (2, 2)}, B={'shape': (2, 2)})

p.model.connect('ivc.M', 'exec.B', src_indices=om.slicer[2:4, 3:5])

p.setup()

p.run_model()

print('M')
print(p.get_val('ivc.M'))

print('A')
print(p.get_val('exec.A'))
Connecting a 2x2 submatrix of M to B
M
[[ 0.  1.  2.  3.  4.]
 [ 5.  6.  7.  8.  9.]
 [10. 11. 12. 13. 14.]
 [15. 16. 17. 18. 19.]
 [20. 21. 22. 23. 24.]]
A
[[13. 14.]
 [18. 19.]]

或者,例如,仅将 5x5 矩阵的第 [0, 2, 3] 行连接到目标:

rint('Connecting rows 0, 2, and 3 of M to B')

p = om.Problem()

ivc = p.model.add_subsystem('ivc', om.IndepVarComp())
ivc.add_output('M', val=np.arange(25).reshape((5, 5)))

exec = p.model.add_subsystem('exec', om.ExecComp())

exec.add_expr('A = B', A={'shape': (3, 5)}, B={'shape': (3, 5)})

p.model.connect('ivc.M', 'exec.B', src_indices=om.slicer[[0, 2 ,3], :])

p.setup()

p.run_model()

print('M')
print(p.get_val('ivc.M'))

print('A')
print(p.get_val('exec.A'))
Connecting rows 0, 2, and 3 of M to B
M
[[ 0.  1.  2.  3.  4.]
 [ 5.  6.  7.  8.  9.]
 [10. 11. 12. 13. 14.]
 [15. 16. 17. 18. 19.]
 [20. 21. 22. 23. 24.]]
A
[[ 0.  1.  2.  3.  4.]
 [10. 11. 12. 13. 14.]
 [15. 16. 17. 18. 19.]]

虽然我们在一些并行化文档中讨论了此功能,但您说得对,我们需要在连接文档中讨论它。