【问题标题】:How to define output variable with dynamic shape in OpenMDAO如何在 OpenMDAO 中定义具有动态形状的输出变量
【发布时间】:2023-02-08 06:08:05
【问题描述】:

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

在openmdao的文档中,我找到了https://openmdao.org/newdocs/versions/latest/features/experimental/dyn_shapes.html?highlight=varying%20shape 它解释说,输入/输出变量的形状可以通过将其链接到形状已知的任何连接变量或局部变量来动态设置。这与我的情况不同,因为在计算开始之前,应力阵列的形状是未知的。 f_const 的形状要在setup 中定义,我不知道以后如何更改它。请在这方面指导我。

【问题讨论】:

    标签: python openmdao nastran


    【解决方案1】:

    你不能让数组像那样改变形状。您在文档中找到的“动态”形状指的是设置时间变化。但是,一旦设置完成,尺寸就固定了。所以我们需要一种方法让你的数组大小固定。

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

    1. 过度分配
    2. 约束聚合

      选项 1 -- 过度分配

      this related question 中详细介绍了该主题,但简而言之,您可以做的是分配一个足够大的数组,以便始终有足够的空间。然后你可以使用数组的一个条目来记录其中有多少个活动条目。任何非活动条目都将设置为不会违反您的约束的默认值。

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

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

      选项 2 -- 约束聚合

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

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

      你的问题仍然有一个不连续的操作正在进行重新网格化和嘈杂的约束数组。 KS 函数应该平滑其中的一部分,但不是全部。我仍然认为您在收敛时会遇到麻烦,但它应该比原始过度分配更好。

      选项 3 --- “正确”的答案找到一种方法来修复你的网格,让它永远不会改变。我知道如果你使用 VSP 生成你的 discritizations 并让 NASTRAN 从那里重新网格化东西,这很难......但这根本不是不可能的。

      OpenVSP 有一组geometry-query functions,可用于将固定网格反拟合到几何体的参数空间中。如果这样做,则可以在 VSP 中重新生成几何体并使用参数化空间来移动固定网格。密歇根大学 MDO 实验室的 pyGeo 工具就是这样做的,而且效果很好。

      它的工作量不大(尽管如果直接使用 pyGeo 会少很多),但我认为它非常值得。您将获得更快的组件和更稳定的优化。

    【讨论】:

      猜你喜欢
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2020-08-14
      相关资源
      最近更新 更多