【问题标题】:OpenMDAO version 2.x File Variable WorkaroundOpenMDAO 版本 2.x 文件变量解决方法
【发布时间】:2018-07-02 02:07:37
【问题描述】:

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

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

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

https://github.com/OpenMDAO/OpenMDAO

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

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

谢谢!

【问题讨论】:

    标签: python-3.x openmdao


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多