首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OpenMDAO中定义动态形状的输出变量

如何在OpenMDAO中定义动态形状的输出变量
EN

Stack Overflow用户
提问于 2022-01-17 08:42:39
回答 1查看 117关注 0票数 1

我目前正在模拟一个结构优化问题,其中响应梯度从Nastran提取并提供给OpenMDAO中的SLSQP优化器。约束的数量在随后的迭代中发生变化,因为设计变量同时包含形状和大小变量,因此每次都生成一个新的网格。约束组件是在OpenMDAO中定义的,它读取从Nastran导出的响应数据。现在,这里的问题是如何定义其输出变量"f_const“的形状。这个输出变量的形状需要根据可用响应数组的形状进行调整,因为输出‘f_const’= np.loadtxt("nsatran_const.dat")。在这里,nastran_const.dat是包含从Nastran提取的响应数据的文件。此数据的形状在设计迭代开始时并不为人所知,并在随后的迭代过程中不断变化。因此,如果在开始时定义了f_const的某些形状,那么它以后不会改变,并且会因为形状的不匹配而产生错误。

在openmdao的文档中,我发现了shapes.html?highlight=varying%20shape,它解释说,输入/输出变量的形状可以通过链接到任何已知形状的连接或局部变量来动态设置。这与我的情况不同,因为在开始计算之前,应力阵列的形状是未知的。f_const的形状将在安装程序中定义,我无法确定以后如何更改它。请在这方面指导我。

EN

回答 1

Stack Overflow用户

发布于 2022-01-17 16:01:44

不能有这样改变形状的数组。您在文档中找到的“动态”形状指的是设置时间的变化。一旦安装完成,大小是固定的。因此,我们需要一种方法,使数组具有固定的大小。

如果每次都必须重新划分网格(我不推荐),那么我可以想到两种可能的解决方案:

  1. 超额分配
  2. 约束聚合

选项1-超额分配

这个主题在这个相关的问题中有详细介绍,但是简单地说,您可以做的是分配一个足够大的数组,使您始终有足够的空间。然后,可以使用数组的一个条目来记录其中有多少活动项。任何非活动项都将设置为不违反约束的默认值。

你必须非常小心你定义导数的方式。对于活动数组条目,衍生产品来自NASTRAN。对于不活动的条目,您可以将它们设置为0,但请注意,当条目切换到active时,您正在创建一个离散的不连续性。这很可能给优化器适合,当它试图收敛时,活动约束的导数保持在0和非零值之间。

我真的不推荐这种方法,但是如果您绝对必须有“可变大小”数组,那么过度分配是最好的。

选项2 --约束聚合

这里的关键思想是使用聚合函数将所有的应力约束折叠成一个值。对于结构问题,这通常是用KS函数来完成的。OpenMDAO有一个可以使用的标准库中的KScomponent

关键是这个组件需要一个恒定大小的输入。因此,再一次,过度分配将在这里使用。在这种情况下,您不应该跟踪数组中的活动值的数量,因为您要将其传递给聚合函数。KS函数就像光滑的最大函数,所以如果您有一串0的值,那么它不应该影响它。

您的问题仍然有一个不连续的操作,与重新啮合和噪声约束数组。KS函数应该会平滑其中的一些,但不是全部。我仍然认为你在收敛上会有困难,但它应该比原始的过度分配更有效。

选项3--“右”答案找到了修复网格的方法,这样就不会改变。我知道如果你用VSP来生成你的描述,让NASTRAN从那里重新划分事情是很困难的.但这并不是不可能的。

OpenVSP有一组几何查询函数,可用于将固定网格支持到几何的参数空间中。如果这样做,那么您可以在VSP中重新生成几何图形,并使用参数空间来移动固定的网格。这就是密歇根大学MDO实验室的pyGeo工具,它运行得非常好。

这是一个适度的工作量(虽然如果直接使用pyGeo就少了很多),但我认为这是值得的。您将获得更快的组件和更稳定的优化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70738549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档