如何解决如何防止 OpenMDAO 组件为派生类分配大型密集数组?
我有一些 OpenMDAO 组件,它们对 x 坐标的一维列表和 y 坐标的一维列表进行数学运算,输出每对的距离和角度列表。每次计算仅依赖于单个 x 和 y。
它们类似于
x = cos(t)
y = sin(t)
d2 = x**2 + y**2
我在 setup
方法中配置的位置
self.add_input("t",shape_by_conn=True)
self.add_output("x",copy_shape="t")
self.add_output("y",copy_shape="t")
self.add_output("d2",copy_shape="t")
和 compute
方法按预期工作。通常 t
是来自 np.linspace()
的一维数组。
在setup_partials
我有
size = self._get_var_meta("t","size")
self.declare_partials("x",["t"],rows=range(size),cols=range(size))
self.declare_partials("y",cols=range(size))
self.declare_partials("d2",cols=range(size))
.
在 compute_partials
中,我将一维 numpy 数组传递给 J["x","t"]
等等。当我将 check_partials
的长度设置为 10 时,测试 t
不会引发任何错误。如果我没有 out_stream=None
,我确实看到它在其输出中打印 10x10 数组。
但是,如果我将 t
设置为 100000,当我运行时
prob.check_partials(out_stream=None)
它尝试分配一个大数组:Unable to allocate 74.5 GiB for an array with shape (100000,100000) and data type float64
。我原以为只会分配大小为 ~100000 的数组,而不是 100000^2。
如果我不运行 check_partials
,而是附加一个 ExecComp
,则会发生同样的错误:
self.add_subsystem("hypotsq",om.ExecComp("d_sq = x**2 + y**2",has_diag_partials=True,x={"shape_by_conn":True},y={"copy_shape": "x"},d_sq={"copy_shape": "y"}))
doc page for Spartial partial derivatives 提到了“稀疏 AssembledJacobian
”和“稀疏全局 jacobian”。我可能需要其中之一吗?我还有什么遗漏了吗?
解决方法
在正常运行期间,它只会分配稀疏的雅可比。但是,在 check_partials 期间,OpenMDAO 会为要放入的 FD 部分分配第二个密集数组。
OpenMDAO 这样做是因为一般来说,正确获取行/列是很棘手的,而且通常有助于查看完整的雅可比矩阵。它显然会导致您的代码出现问题,我可以建议一些解决方法:
-
当您运行 check_partials 时,将您的组件设置得更小。您可以在运行时使用完整大小,但检查时会过多。
-
如果使用大值
t
进行检查对您很重要,请考虑使用 directional derivative checking instead.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。