首页 > 解决方案 > OpenMDAO 版本 2.x 文件变量解决方法

问题描述

我是 OpenMDAO 的新手,从最新版本开始(在本文发布时为 2.3.1 版)。

我正在使用几个外部代码,特别是 NASTRAN 和几个后处理 NASTRAN 结果的可执行文件(编译的 C++),对相当复杂的航空结构优化进行设置。

理想情况下,我想将这些分解成多个组件来生成我的模型,运行 NASTRAN,对结果进行后处理,然后从文本文件中提取我的目标和约束。我现有的所有界面都是通过文本文件输入和输出。根据 GitHub 页面,旧版本(v1.7.4)中存在的文件变量功能尚未在版本 2 中实现。

https://github.com/OpenMDAO/OpenMDAO

在添加该功能之前,是否有一个好的解决方法?

到目前为止,我想出的最佳解决方案是将所有内容分组到一个大型组件中,通过运行所有内容而不是分解流程的多个较小组件来将输入变量映射到最终输出。

谢谢!

标签: python-3.xopenmdao

解决方案


文件变量本身不再在 OpenMDAO 中实现。它们引起了很多麻烦,并且从根本上没有提供有用的功能,因为它们需要将整个文件序列化到内存中并将其作为字符串缓冲区传递。整个过程只是重复且效率低下,因为文件最终从磁盘写入和读取的次数远远超过了必要的次数。

在您的情况下,由于您正在设置航空结构问题,因此您真的不想使用它们。您将希望访问分析或至少半分析的总导数以有效执行。所以这意味着每个组件的边界必须仅由浮点变量或浮点变量数组组成。

您想要做的是使用ExternalCodeImplicitComp包装您的分析工具,它告诉 openmdao 底层分析实际上是隐式的。然后,即使您使用有限差分来计算偏导数,您也只需要在残差评估中进行 FD。对于 NASTRAN,设置起来可能有点棘手,因为我不知道它是否直接暴露残差评估,但如果你能得到刚度矩阵,那么你应该能够计算它。您的努力将得到回报,效率和准确性将大大提高。

在每个包装器中,您可以使用内置的文件包装工具来读取写入的文件并提取数值,然后将其推入输出向量。对于 NASTRAN,您可以考虑使用pyNASTRAN而不是文件包装工具,以节省一些工作。

如果您无法公开残差评估,则可以改用ExternalCodeComp并将分析视为显式分析。这将使您的 FD 成本更高且准确性更低,但对于线性分析,您应该没问题(仍然不理想,但总比没有好)。

这里的关键思想是您不要求 OpenMDAO 传递文件对象。您在每个组件的边界处仅使用数字数据包装每个组件。这具有允许 OpenMDAO 的自动导数功能工作的优点(即使您使用 FD 来计算偏导数)。它还有一个次要优势,如果您(希望)为您的代码升级到内存包装器,那么您将不必更新您的模型。只有组件的内部代码会改变。


推荐阅读