openmdao - 避免分析中的奇异性——OpenMDAO 是否自动启用“完全同步”解决方案?
问题描述
当以规定的边界层边缘速度 u e求解时,湍流边界层计算在流动分离点处失效,即所谓的直接法。
这可以通过以完全同时或准同时的方式求解系统来缓解。有关这两种方法的详细信息,请参见此处 ( https://www.rug.nl/research/portal/files/14407586/root.pdf ),第 38 页起。本质上,全同时法将无粘性和粘性方程组合成一个大型方程组,并用牛顿迭代法求解它们。
我目前完全在 ExplicitComponents 中实现了一个无粘性面板求解器。我打算也完全使用 ExplicitComponents 来实现边界层求解器。我不确定这两个组的耦合是否会导致像直接方法一样的执行过程,或者它是否会像完全同时的方法一样工作。我注意到在 OpenMDAO 论文中,声明组件是“作为单个非线性方程组”求解的,并且从显式组件到隐式系统的重新表述由 OpenMDAO 自动处理。
这是否意味着如果我结合我的两个分析(再次,纯粹由 ExplicitComponents 组成)并将组设置为使用牛顿求解器求解,我将“免费”获得一个完全同步的解决方案?这似乎好得令人难以置信,因为最终集成边界层方程的组件将不得不将一些规定的 u e作为输入,然后在执行其 compute() 方法时会遇到奇点。
如果执行上述操作会使它像直接方法一样执行并导致奇点,(简要地)我需要进行哪些更改来避免它?是否需要隐式定义边界层组件?
解决方案
尽管看起来好得令人难以置信,但实际上您可以通过更改顶级求解器来更改系统的结构。
如果您在顶部使用NonlinearBlockGS求解器,它将以弱形式求解。如果您在顶部使用NewtonSolver,它将作为一个大型单片系统求解。这个属性确实源自 OpenMDAO 存储事物的独特结构。
有一些警告。我猜您的面板代码是作为一组中间计算实现的,这些计算被分解为多个组件。如果是这种情况,那么 NewtonSolver 将把每个中间变量视为它自己的状态变量。换句话说,您将不仅拥有状态,delta
而且u_e
还拥有所有中间计算。
这可能有点不稳定(尽管它可能工作得很好,所以试试吧!)。您可能需要弱形式和强形式之间的混合,这可以通过solve_subsystems
NewtonSolver 上的选项来实现。这种方法在 OpenMDAO 论文的第 5.1.2 节中称为分层牛顿法。它将为每个顶级牛顿迭代进行 NLBGS 的子迭代。这充当了一种非线性预条件子,可以帮助稳定强形式。您可以限制完成多少次子迭代,在您的情况下,由于存在奇异性的风险,您可能只想使用 2 或 3 次。
推荐阅读
- powershell - 为什么我不能在 powershell 中更改“实时监控”参数值?
- python - How to convert [element, element, element] into [(1, element), (2, element), (3, element)]
- javascript - 那么为什么不保持回调的顺序呢?
- filter - 如何根据 Tableau 中另一列的值过滤一列
- java - 片段选项卡未附加到上下文
- python - UnboundLocalError:在赋值之前引用了局部变量“userOrder”,但是之前以类似的方式调用它没有错误
- android - 将 http 网络流量限制为仅图像
- game-development - 程序生成的 2D 洞穴/地牢,用于类似横向卷轴的游戏
- amazon-web-services - 限制 AWS CDK 中的 AppSync 权限
- r - R函数漂亮()未显示预期结果