我是OpenMDAO的新手,并且从最新版本开始(在撰写本文时为2.3.1版)。
我正在使用一些外部代码,特别是NASTRAN和一些可执行NASTRAN结果的可执行文件(编译的C ++),对相当复杂的航空结构优化进行设置。
理想情况下,我想将这些细分成多个组件以生成我的模型,运行NASTRAN,对结果进行后期处理,然后从文本文件中提取我的目标和约束。我所有的现有接口都是通过文本文件输入和输出。根据GitHub页面,旧版本(v1.7.4)中存在的文件变量功能尚未在版本2中实现。
https://github.com/OpenMDAO/OpenMDAO
在添加功能之前,是否有很好的解决方法?
到目前为止,我想出的最好的解决方案是将所有内容分组为一个大的组件,该组件通过运行所有内容而不是破坏该过程的多个较小的组件将输入变量映射到最终输出。
谢谢!
答案 0 :(得分:1)
文件变量本身不再在OpenMDAO中实现。它们引起了很多麻烦,并且根本没有提供有用的功能,因为它们需要将整个文件序列化到内存中并将其作为字符串缓冲区传递。整个过程是重复的且效率低下的,因为最终从磁盘写入和读取文件的次数远远超过了必要的时间。
在您的情况下,因为您要设置一个航空结构问题,所以您实际上绝对不想使用它们。您将需要访问分析或至少半分析的总导数以有效执行。因此,这意味着每个组件的边界必须仅由浮点变量或浮点变量数组组成。
您要做的是使用ExternalCodeImplicitComp包装分析工具,该工具告诉openmdao底层分析实际上是隐式的。然后,即使您使用有限差分来计算偏导数,您也只需要在残差评估中进行FD计算。对于NASTRAN来说,设置起来可能有些棘手,因为我不知道它是否直接公开残差评估,但是如果您能够获得刚度矩阵,那么您应该能够对其进行计算。您所付出的努力将得到回报,其效率和准确性将大大提高。
在每个包装器内,您可以使用内置的file wrapping tools来读取已写入的文件并提取数值,然后将其推入输出向量中。对于NASTRAN,您可以考虑使用pyNASTRAN(而不是文件包装工具)来节省一些工作。
如果您不能暴露残差评估,则可以改用ExternalCodeComp并将分析视为明确的。这将使您的FD成本更高,准确性更低,但是对于线性分析,您应该可以(仍然不理想,但总比没有好)。
这里的关键思想是您不要求OpenMDAO传递文件对象。您将在每个组件的边界处仅包裹数字数据。这具有允许OpenMDAO的自动导数功能工作的优点(即使您使用FD计算偏导数也是如此)。它还具有第二个优势,即(如果希望)毕业于内存包装器中的代码,则无需更新模型。仅组件的内部代码将更改。