研究与求解器 – COMSOL 博客 - //www.denkrieger.com/blogs 发布博客 Tue, 01 Oct 2024 14:06:13 +0000 en-US hourly 1 https://wordpress.org/?v=5.7 批处理扫描功能的优势 //www.denkrieger.com/blogs/the-power-of-the-batch-sweep //www.denkrieger.com/blogs/the-power-of-the-batch-sweep#comments Thu, 18 May 2023 22:44:00 +0000 http://cn.staging.comsol.com/blogs?p=170991 你有没有过通宵运行大量参数化扫描,第二天早上发现仍未完成求解的经历?在等待最后几个参数收敛的时候,你可能希望先查看已经计算出的参数解。批处理扫描 功能是解决上述问题的有效方法,计算好的参数化解会自动保存为文件,便于打开进行可视化及结果评估。

编者注: 这篇博客最初发表于 2016 年 2 月 2 日,现在已经更新用于反映软件的新特征和新功能。

批处理扫描:大多数仿真分析的有效解决方案

在上一篇博客中,我们探讨了批处理扫描中任务并行的附加值。这篇文章,我们将讨论批处理扫描的另一个重要功能:在求解过程中检索参数化扫描的解。使用批处理扫描可以随时检索部分解,即使在求解器无法求解某些参数时,也可以这样做。当所研究的问题中每个参数的解都独立于其他所有参数的解时,就适合采用批处理扫描。

在求解器扫描过程中,希望查看部分解的情况很多,例如:

  • 当基于表格中的输入数据扫描时,你发现求解表格中列出的一部分数值所需的时间格外长,但无法判断具体是哪些值。这时,你希望能查看尽可能多参数的解,来判断是否需要中止求解过程,或者在所有扫描完成之前开始分析结果。
  • 你用数学表达式描述某一材料属性或边界条件,结果却得到某些参数的非物理解。
  • 你用 C 语言或 FORTRAN 语言编写了一个有关定义复杂材料的外部函数,但未检查所有的输入数据,结果某些参数值的输出数据出现了异常。
  • 你正运行参数化扫描,其中一个参数为几何尺寸,但参数尺寸的范围定义得过大。当你意识到这一点时,求解已经运行了很长时间,所以不希望停止。

如果你在以上任何一种情况中运行批处理扫描,每个参数都能在一个单独的进程中求解,这个进程可以独立开始和停止。求解完成的参数值都被存储为一个.mph 文件,你可以在求解过程中打开任何数量的文件进行查看。在下面的示例中,你将了解如何将探针结果保存到文本文件中。

静电传感示例

为了演示批处理扫描,我们使用 COMSOL Multiphysics® 案例库中的 电传感器示例模型来展示批处理扫描的操作。此模型展示了如何通过在盒的边界施加电位差,获得盒内的图像信息。模型计算的表面电荷结果取决于盒内物体的介电常数,该结果也可用于判断例如盒内是否存在物体,甚至可以帮助确定物体的形状。电阻抗断层成像案例中也采用了类似的技术进行医疗诊断,但使用的是交流电。

电传感器模型中盒外的表面电荷。
盒外的表面电荷。

屏幕截图显示了盒内待检测的物体。
盒内待检测的物体。

原示例模型中将物体厚度拉伸为 0.8 米。本文示例中,物体厚度被拉伸为 0.5 米。

参数化扫描的输入数据

假设有一组包含十个样本物体,这些样本形状相同但由具有不同介电常数的材料制成。我们要探究的是检测物体及其形状的能力,不管物体由什么材料制成。十个样本的介电常数值已存储在内插表 int1 中。实际上我们不会使用这个表格进行任何插入操作,而是把它作为一种存储和调用表格值的简便方法。(在这里,我们可以将内插方法从默认的 线性内插 改为 最相邻内插,但在本示例中结果不变。)

模型开发器中的介电常数表格。
介电常数的表格。

现在用全局参数 sn(样本编号的英文缩写)对这个样本集添加索引。

使用全局参数对样本组添加索引。
作为全局参数的样本编号参数 sn 。

此模型在材料节点下定义了三种材料。材料3表示盒内的星形物体,材料 2表示其他物体。材料 1对应盒内物体周围的空气。我们通过适当调用材料3材料属性中定义的内插表 int1,来改变星形物体的介电常数,使用的语法为 int1(sn)。请注意,这里无需考虑单位,因为介电常数是无量纲。

星形物体的介电常数。
通过参数 sn 在表格中索引得到的星形物体的介电常数。

探测表面电荷

为了监测星形物体上方的表面电荷,我们在盒子上表面的 x = 1.5,y = 1.5,z = 1.0 位置处定义了一个边界点探针。为了快速定义此位置,我们可以单击物体上表面的一个大致位置,然后在 设置 窗口中手动调整坐标值。

所研究物体上方的边界点探针。
研究物体上方的边界点探针

至于点探针表达式,我们选择用变量名 es.nD 和单位 nC/m^2 来表示表面电荷的大小(模值)。

点探针表达式设置窗口的近视图
单位为 nC/m^2 的表面电荷的 点探针表达式

稍后,我们会将此探针的输出写入文本文件。为此,单击 更新结果。此操作会生成 派生值表格项

边界点探针设置中的更新结果按钮
探针的 更新结果 按钮

在 COMSOL Multiphysics® 中设置批处理扫描

默认情况下,软件不会显示批处理扫描选项。可以在模型开发器的工具栏选择 显示更多选项 来启用该选项。在 显示更多选项 对话框选择 研究>批处理和集群

显示更多窗口中打开的批处理和集群研究
在模型开发器中的 显示更多选项 菜单激活 的高级研究选项

如果右键单击 研究 节点,可以在列表中选择 批处理扫描 (单次运行,选择 批处理,而不是 批处理扫描)。

 COMSOL Multiphysics中的批扫描菜单选项。
研究 菜单中选择 批处理扫描

在如何定义扫描范围方面,批处理扫描与参数化扫描相似。在这里,我们使用整数 1 到 10 来定义参数 sn 扫描时的步长。

扫描的参数范围。
批处理扫描的参数范围。

批处理扫描 模型树 设置 窗口的 批处理设置 栏中包含了用于控制结果的设置。

在批量扫描设置窗口中展开的批量设置部分的屏幕截图。
控制批处理扫描的设置。

默认文件名为 batchmodel.mph,用于自动创建一个 MPH 文件序列,其中的每个文件对应于扫描中的每个参数。可以更改文件名,不过此处演示的示例仍保留此文件名,生成的 MPH 文件名将分别为 batchmodel_sn_1.mphbatchmodel_sn_2.mph,……,batchmodel_sn_10.mph。稍后,我们会探讨这其中的每个文件为何是一个可以单独打开并执行后处理的完整的模型。

扫掠前 部分有两个选项:清除网格和清除解。我们清除了这两个复选框,因为只有在执行远程集群计算或云计算时,这两个选项才真正有用,并希望通过网络传递的文件尽可能小(只有使用网络浮动许可证时才能这样做)。

在扫描过程中 部分有两个选项:同步解同步累积探针表同步解 将存储的所有文件中的结果从开始仿真时收集到“主模型” MPH 文件中,最终结果与运行参数化扫描的结果极其相似。在这个示例中,选择清除这个复选框是因为我们假设只对查看单个结果感兴趣。此外,如果扫描的范围过大,收集全部结果可能会消耗大量时间和内存。保持选中 同步累积探针表 状态,表示对探针的输出结果进行累积,与完整的求解信息相比,收集这种信息非常轻松。

扫掠后部分中,我们勾选输出模型到文件复选框,确保自动保存的 MPH 文件包含(每个参数的)解,同时会增加磁盘空间。

在下一节,将 群集计算 设置更改为 用户控制。然后,将 目录 更改为 C:\COMSOL。这就是存储所有批处理文件的位置。

如果你有网络浮动许可证,并且希望使用远程安装的 COMSOL 软件执行这一计算,可以使用 指定服务器路径 选项。本文我们只讨论包括单用户许可证在内的 COMSOL 所有许可证类型都能使用的功能。

将探针数据保存到文件

为了将探针数据保存到文件,我们不能使用常规的探针表,而是使用一种特殊的 累积探针表。第一步是手动添加一个探针表,即右键单击 结果 下的表格 节点,将表格名称改为 保存的探针表。稍后,我们会通过批处理扫描在其中写入累积探针表的数据。当需要将异步生成的数据在表格中按照一定的顺序排列时,就可以使用累积探针表。请记住,一般来说,我们不清楚不同的参数对应的解应该按照什么顺序排列,而累积探针表帮我们解决这一难题。

屏幕截图显示了如何添加保存的探针表
手动添加保存的探针表。

在保存的探针表设置中,将 存储表 设置改为 模型和文件中。在本示例中,我们将探针结果保存到 C:\COMSOL\results.txt。如果扫描的数量过于庞大,则可能需要提高 最大行数 的值(这通常适用于需要大量扫描的情况或瞬态解)。

保存的探针表设置的屏幕截图。
保存的探针表设置。

批处理扫描 设置的 求解时输出 一栏中,将 输出表 改为 保存的探针表。这就是我们的累积探针表。

突出显示具有批处理扫描的模型开发器,并展开具有求解时输出部分的相应设置窗口。
保存的探针表 用作 累积探针表

运行批处理扫描

现在,可以单击 计算 启动批处理扫描。求解过程中,图形窗口下的信息窗口显示一个 外部进程 窗口。

外部进程窗口屏幕截图
外部进程窗口

通过外部进程窗口,我们可以了解正在运行的批处理进程及其状态的概况。在本文示例中,共有十个这样的进程,分别对应扫描中的每一个参数。

在这个阶段,大部分的用户界面不能交互,但可以单击进度条左侧的脱离作业,重新获得对用户界面的控制。

脱离作业选项
脱离作业 选项

使用脱离作业后,就看不到进程状态的实时更新了,不过这时可以对各个进程执行操作。

屏幕截图显示了脱离作业后外部进程窗口。
脱离作业后的 外部进程 窗口。

此时,我们可以停止所有进程,或者单击某一行来停止该进程,甚至可以单击表中状态为 完成 的进程,在另一个 COMSOL Desktop 窗口中打开它。在新打开的窗口中,我们可以执行任何可视化操作或后处理任务,这些任务通常需要在模型中运行。

外部进程窗口的打开文件选项。
选择一个完成的外部进程,单击 打开文件,即可在一个新的 COMSOL Desktop 窗口中显示结果。

单击 外部进程 窗口左上角的 附加作业,就可以重新显示进程状态的实时更新。

屏幕截图显示了外部进程窗口的附加作业选项。
外部进程 窗口附加作业。

探针结果文件

我们可以使用 Notepad 等文本编辑器打开包含探针输出的 results.txt 文件。

探针结果近图
包含边界点探针结果的 results.txt 文本文件。

我们也可以在求解过程中查看这个文件,从而在全部参数都完成收敛之前快速浏览结果。不仅是批处理扫描可以这样做,对于常规的参数化扫描,在表格保存为文件后也可以在求解过程中查看。

使用批处理扫描功能时需要考虑的其他因素

性能

如果扫描中每次计算速度都很快,并且不需要很大的内存,如上文中的示例所示,批处理扫描所需的计算时间会比常规的参数化扫描的时间长。因为采用批处理扫描时,每个参数都会启动一个 COMSOL Multiphysics 进程。对于每一个计算要求都较高的参数扫描,这个额外启动进程的时间相对较短,可忽略不计。

参数错误处理

假设我们调用的是用户定义的外部 C 语言函数,而不是内插表;同时假设我们在 C 代码中犯了一个编程错误,导致一个或几个参数在扫描时出现分段错误。这种情况下,我们仍然可以浏览 C:\COMSOL 目录(或者指定保存 .mph 文件的目录),打开其中的文件执行可视化及后处理,甚至进一步的计算工作。

在上文示例中,演示此类错误的一个简单方法是将其中的一个介电常数值设为零,然后启动批处理作业。介电常数为零意味着我们向求解器提供了一个定义模糊(甚至是异常)的方程(类似于 0 = 1),此时会显示一条错误消息,提示求解器找不到出错参数的对应解。同样地,仍可以打开保存的 .mph 文件并执行后处理。如果更正了表格,将介电常数改成非零,就可以重新运行批处理作业并且不会收到错误消息。请注意,如果错误一直存在,则对 外部进程 窗口附加作业时始终会提示错误。此时,仍会更新累积探针表中与其他参数对应的项。更正错误后继续运行扫描,对外部进程窗口附加作业后就可以再次访问该窗口了。

管理多核处理

如果你有一台多核计算机,这是现代电脑的常见配置,就可以更改 批处理 的相关设置,控制批处理扫描中可运行的并发进程数,以及每个进程可用的内核数。假设你使用的是六核机器,那么可以将 并发作业数改为三,将 内核数 改为二。这样设置后,可以并行求解三个参数,每个求解器进程可使用两个内核,所以对于上面的示例,仿真时间减少了一半。

如果所运行的仿真中每个参数的计算量都很少,可以增加并发作业的数量,使其与计算机的内核数相同。对于计算量较大的问题,应该保持并发作业数为一,以充分利用求解器的多核处理能力。

多核批处理设置。
批处理设置中的并发作业数和内核数。

请注意,也可以在批处理扫描 节点研究扩展 一栏下控制并发作业数。这种情况下,软件会用实际内核数除以并发作业数,自动计算出“内核数”。(要实现自动计算,请不要勾选 批处理 设置下的 内核数 复选框,就不会使用以灰色显示的数字 1。)

批处理扫描和 App 开发器

借助 App开发器,我们可以在用于构建 App 的模型中使用 批处理扫描 节点。此时,App 充当批处理扫描的“驱动”,且无法在 外部进程窗口中看到相关信息。也无法在该窗口中看到保存的 .mph 文件,就像此 App 根本没有用户界面。运行结束后,我们可以打开这些文件进行传统的模型后处理工作。如果需要更灵活地创建可使用 批处理扫描 的App,可以使用一个内置的方法来包含 批处理扫描 ,详细请参考 Programming Reference Manual。(注意,在这里使用“录制代码”工具的作用很有限,因为在生成录制的代码时会与实时运行的批处理命令冲突。)

批处理扫描 vs 集群扫描

COMSOL Multiphysics 的所有许可证类型都可以使用 批处理扫描 功能。如果你有网络浮动许可证,则还可以使用 集群扫描 这一附加功能。这两个扫描功能很相似,不过 集群扫描 选项多了远程计算和集群配置等设置。集群扫描功能可以将大量扫描分散到一个(很可能是大型的)集群上。这种做法可以显著提高效率,因为独立扫描(也称作易并行计算)所涵盖的范围通常很广。如果你已熟练掌握了批处理扫描,那么运行集群扫描也不是什么难事。

下一步

想亲自动手尝试模拟这篇博客中讨论的模型吗?欢迎进入 COMSOL 案例库,下载示例模型:

拓展阅读

阅读 COMSOL 博客,了解更多关于批处理扫描和集群扫描的文章:

]]>
//www.denkrieger.com/blogs/the-power-of-the-batch-sweep/feed/ 2
如何计算 CAD 几何文件的投影面积 //www.denkrieger.com/blogs/how-to-compute-the-projected-area-of-a-cad-file-in-comsol //www.denkrieger.com/blogs/how-to-compute-the-projected-area-of-a-cad-file-in-comsol#comments Thu, 20 Jan 2022 03:02:49 +0000 http://cn.staging.comsol.com/blogs?p=289861 你有没有遇到过想要计算 CAD 几何文件的投影面积的时候?这在很多情况下都很有用,例如快速估计空气动力阻力。如果你只需要计算几个方向上的投影面积,有好几种方法可以做到;但是,如果你想计算所有可能方向上的投影面积怎么办?今天,我们将介绍一种计算和使用这类数据的有效方法。

几种简单的方法

假设有一个复杂的 CAD 几何图形,我们首先要考虑的是:这个几何图形沿特定方向的投影面积是多少?有几种方法可以做到这一点?第一种方法,我们可以使用广义投影算子。这种方法需要围绕整个几何图形绘制一个框,如果想要获得良好的分辨率,就必须进行非常精细的网格划分。由于在整个域上进行网格划分和积分的成本很高,这种方法可能非常耗时。第二种方法是 COMSOL 6.0 中的新功能,即三维模型投影功能。这个新功能可以使我们在空间中绘制工作平面并将三维 CAD 几何文件投影到该工作平面上,然后直接测量这些投影的面积。这种基于 CAD几何文件的方法要快得多,并且不需要任何网格划分,但是需要使用 COMSOL 软件的CAD 导入模块设计模块或 LiveLink™ 产品。如果我们想要计算沿多个不同任意方向的投影面积,上述这两种方法都比较繁琐。

CAD 文件的投影面积由通用投影操作符(左)和设计模块的投影功能(右)确定。
确定投影面积的两种方法: 使用 广义投影 算子,其结果取决于网格(左);使用 投影功能,在一组工作平面上创建投影表面(右)。

一种更通用的方法

相比对 CAD 几何文件划分体网格或添加其他 CAD 操作,我们可以利用投影区域的定义,即:

A_{projected}= \int_A \cos\left( \beta \right) dA

其中,对于那些沿视线方向可见的表面, 是视线与表面法线之间的夹角。

对表面进行积分很容易,但是如何评估项 ?事实证明,当使用无限距离 外部辐射源照射时,我们可以通过 表面对表面辐射 接口获得该项。计算这个项只需要部分面网格,而非体网格。使用此接口甚至不需要求解表面到表面的辐射,因为这种带有阴影的入射外部通量是作为预处理步骤计算的。因此,我们可以简单地对所有表面上的外部通量进行积分,然后除以标称入射通量,就可以得到在 外部辐射源 接口中输入的任何方向的投影面积。由于默认使用四阶高斯积分,因此可以使用相当粗的网格。

显示外部辐射源功能的设置窗口的屏幕截图。
外部辐射源特征可用于设置几何体的光照以计算投影面积。

通过入射通量确定的投影面积,如使用外部辐射源功能预先计算的那样
对通过 外部辐射源 特征预先计算的入射通量进行积分可以获得投影面积。注意机翼的阴影。

在所有方向上提取和使用投影面积数据

通常,我们需要从各个方向提取投影区域。现在我们可以简单地对任何感兴趣的入射方向重新计算上述积分,但计算成本将非常高。

相反,想象物体周围有一个球体,并在该球体上选择有限数量的方向来照射目标。在这些有限的方向集之间,我们可以在整个球体表面上使用线性内插法。但是,在选择这些方向之前,值得一提的是,投影区域将关于通过周围球体中心的任何平面对称。本文中使用的 CAD 几何图形关于中平面对称,所以利用这两个对称性,只考虑位于空间正 xy 象限的四分之一球体就可以了。

接下来,进行以下步骤:

  1. 创建几何,利用 CAD 零件的对称性,用有限数量的点定义观察方向
  2. 计算沿这些方向的投影横截面积
  3. 将数据插值到所有中间方向
  4. 提取这些数据

首先,我们创建一个非常特殊的几何图形,如下图所示。该几何图形看起来像一个四分之一球体的网格,它是通过首先单独创建一个单位球体的一部分的网格,导出该网格,然后将其导入模型的第二个 组件 来创建的。导入的设置是这样的,表面网格的每个单元都是一个单独的表面,每个节点都是一个几何点。该表面位于空间的正 xy 象限。

导入设置的屏幕截图(左)和一个网格,其中每个元素代表一个不同的面(右)。
导入设置的网格,使每个单元代表不同的面。

这些点中的每一个都将代表一个采样方向,我们将评估其投影面积。在这些点之间的每个三角形块上,我们将使用线性有限元基函数对区域进行线性插值,以便可以从任何入射角近似投影区域。

为此,我们在四分之一球模型的所有表面上添加 系数形式偏微分方程接口,将离散化设置为线性,并将因变量的名称设置为 AREA

设置窗口的屏幕截图,显示了用于实现插值的系数形式边界 PDE 接口
设置 系数形式偏微分方程接口将实现插值。

在这个接口中,我们将对几何中的所有点施加 逐点约束 特征,这样就可以对问题进行完全约束,因为所有的节点点都是几何点。这些设置的最终效果是所有其他物理设置都无效,并可以保留它们的默认值。我们将得到每个曲面拐角处的约束节点值之间的线性插值解。

设置窗口的屏幕截图,显示了系数形式边界 PDE 界面中的逐点约束特征。
对模型上的所有点施加 逐点约束特征。

由于需要在每个点设置离散观察方向的投影面积,因此我们使用了以下约束表达式:

AREA-nojac(if(dom==INDEX,comp1.intop1(rad.Gext/1[W/m^2]),AREA))

展开这个表达式,它设置了 AREA每个点的值。首先,整个表达式必须等于 0,因此 AREA 被设置为等于 nojac() 算子的表达式。这个算子意味着其中的表达式没有增加雅可比贡献,有关这个运算原理的更多详细信息,请参阅关于通过符号微分加速模型收敛的博客文章。在这个算子中是 if(logical expression, true, false)语句。这个语句以逻辑表达式 dom==INDEX 开头。每个几何对象(域、边界、边或点)都有一个与之关联的唯一整数:它的域索引 dom。在我们即将进行的研究中,将对这个几何图形中所有点的全局参数 INDEX 进行辅助扫描。

在扫描期间,当逻辑表达式的计算结果为假时,AREA 变量保持不变。当逻辑表达式为真时,得到投影面积,即截获通量除以入射通量的积分。积分算子 comp1.intop1() 被定义在我们的第一个组件中,覆盖 CAD几何文件的所有暴露表面。但是,当计算这个积分时,第一个分量中的 外部辐射源 特征如何得出与第二个分量中的点相关联的方向?我们在第二个分量中的所有点上使用第二个积分耦合变量,并在外部辐射源 方向场中使用它:

comp2.intop2(x[1/m]*(dom==INDEX))

解读这个表达式的方法是:评估第二个组件中的所有点,即 x 位置(或 y-或 z 位置),然后乘以 (dom==INDEX),结果将是 0 或 1。也就是说,我们将仅对当前索引的点评估朝向该点的光照矢量,如下面的屏幕截图所示。

显示组件 1 的外部辐射源功能的设置窗口的屏幕截图。
在第一个组件中,入射辐射方向是根据第二个组件中的几何定义的点位置来设置的。

接下来,我们要扫描索引变量的所有值,我们通过包含辅助扫描的稳态研究步骤 来完成。在这项研究中,我们不需要求解表面到表面的辐射,因为入射通量是一个预处理步骤。

设置窗口的屏幕截图,显示包含辅助扫描的固定研究步骤。
扫过索引变量将获得投影面积。

由于只有扫描中的最后一个值包含所有结果,因此我们可以弃除最后一个解之外的所有内容。这可以通过 组合解 研究步骤完成,如下面的屏幕截图所示。

显示组合解决方案功能的设置窗口的屏幕截图,该功能用于保留扫描中的最后一个解决方案。
使用 组合解 特征仅保留扫描中的最后一个解。

接下来,为了举例说明如何使用这些数据,我们用一个具有 瞬态 步骤的研究来说明。在该研究中,我们将根据与飞机轴对齐的球坐标系在球体表面上追踪一个点,并且向上定义 角。

CAD 模型和投影区域,由一组点表示。
CAD 模型和沿离散方向的投影区域,由一组点表示,以及在一个表面上的插值。沿着在该表面上追踪的一条线的场值可以通过球坐标系上的 广义拉伸算子进行评估。

设置窗口显示常规拉伸操作符。
通过广义拉伸 算子从球体表面的插值数据中提取数据。

对于球坐标系,要从该球体上的任意位置提取数据,我们可以将广义拉伸算子 用作动态探针,通过输入目标映射 表达式的变量,来说明解对称性。

结束语

有多种方法可以计算 CAD几何文件的投影面积。在本文介绍的三种方法中,使用 广义投影 算子的计算成本最高,因为它在一个域上集成并且需要在周围域中使用精细的网格。因此,只有在不能使用其他两种方法时才使用它。第二种方法是基于 CAD 的操作,即使用 投影 特征。虽然这种方法简单、准确并且不需要划分网格,但需要手动设置每个投影方向。最后一种方法,使用 表面对表面辐射 接口是最复杂的设置,但在重用数据以进行进一步的基于方程的建模方面,提供了极大的灵活性。点击下方按钮,下载关于此方法的教程模型文件:

 

]]>
//www.denkrieger.com/blogs/how-to-compute-the-projected-area-of-a-cad-file-in-comsol/feed/ 1
如何从命令行运行 COMSOL Multiphysics® //www.denkrieger.com/blogs/how-to-run-comsol-multiphysics-from-the-command-line //www.denkrieger.com/blogs/how-to-run-comsol-multiphysics-from-the-command-line#comments Wed, 09 Dec 2020 02:18:33 +0000 http://cn.staging.comsol.com/blogs?p=244561 你知道如何从命令行运行同一个模型文件的多种工况并自动导出数据吗?我们只需要在 COMSOL Multiphysics® 软件的用户界面(UI)中进行少量准备工作,就可以使用方法来扩展模型文件,在方法中通过命令行自动实现许多模型的设置和计算。下面,我们来看看如何操作……

从模型写出数据

以在 COMSOL® 软件介绍中使用的模型——母线板教程模型 为例来演示如何操作这一工作流程。该模型具有多个需要研究的参数化输入以及需要得到的输出。

首先,将模型中的一些数据写入硬盘。我们的模型已经建立了多个绘图,包括其中的一个温度场。右键单击此特征,然后选择 添加要导出的图像 选项,将获得结果 > 导出 > 图像 特征,其设置如下面的屏幕截图所示。在这些设置中,键入输出文件名。请注意,我们还可以根据需要调整图像布局 设置。我们可以添加一些类似的特征,并导出其他类型的数据,包括动画、网格信息等。如果要一次性写出所有这些数据,请右键单击导出 分支,然后选择全部导出 选项。

A screenshot of the COMSOL Multiphysics model tree with the Results node opened to the Export branch and the image export settings opened.
屏幕截图显示了结果中的导出分支,此处用于导出图像文件。

我们还可以提取一些标量值。在结果 分支下添加计算组 特征,并添加任意数量的派生标量值。例如,对所有域中的损耗进行 积分 并计算最高温度。在 计算组 设置中,还可以指定文件名,如下所示。

A screenshot of the Evaluation Group node opened to the settings that specify writing numerical data to a file.
该屏幕截图显示了 计算组,将数据组合并写到文件中。

最后,结合计算组导出 特征,我们可以从模型中写出任意数量的数据。现在,让我们看看如何进一步实现自动化操作。

通过模型方法自动操作

我们需要 Microsoft® Windows™ 操作系统来使用模型方法,因为我们将使用 App 开发器 功能。单击功能区中的 App 开发器 按钮,或使用键盘快捷键 Control + Shift + A,将进入下图所示的界面。此处我们需要做的是在方法 分支中添加一个新方法,并为其命名,例如,my_method,但是先不添加任何内容。通过左上方的按钮或键盘快捷键 Control + Shift + M 返回到模型开发器。

The Application Builder zoomed in and open on a blank Method Editor window for writing a method to run COMSOL Multiphysics from the command line.
建立了一个方法的 App 开发器屏幕截图。

回到模型开发器,添加方法调用。右键单击全局定义,然后转到方法调用 子菜单,我们将在其中看到我们刚刚创建的方法。添加并确保更改标记 字段。通常,我们可以使用与App开发器中相同的名称。我们可以在下面的屏幕截图中看到方法调用 特征具有三个按钮:

  1. 运行
  2. 停止
  3. 编辑方法

编辑方法 按钮是一个快捷方式,可以便于切换到 App 开发器,一旦我们需要在方法中添加代码时就可使用此功能。

A screenshot of a Settings window showing how to add a call to a method in the Model Builder.
在模型开发器中添加方法的调用,使我们能够运行和编辑该方法。

如果对编程不是很熟悉,那么我们可以执行以下操作:方法包含代码片段,其中每行代码包含在模型上的某种修改或操作。有 2 种方法可以从模型开发器中提取这些代码片段。

第 1 种方法是转到开发工具 选项卡,然后单击录制方法。接着,我们可以在模型开发器中执行一系列完整的操作,直到单击停止录制 按钮。相关代码将保存到新方法中。

在第 2 种方法中,右键单击模型树中的特征,并且(在大多数情况下)我们将看到作为代码复制到剪贴板 子菜单。在模型的研究 分支上进行尝试,其中一个选项是运行。选择此选项可将用于运行的代码片段复制到剪贴板。转到方法编辑器并粘贴(Control + V)以查看代码:

model.study(“ std1”).run();

第 2 种方法比较简单,因此我们在这篇博客文章中使用了此方法。

A screenshot of the export settings with a menu expanded and the option Copy as Code to Clipboard selected.
复制用于运行模型树的特定节点的代码。

我们可以添加更多代码来自动执行数据提取。我们已经设置了将数据写到硬盘的功能,现在只需要在我们的方法中包括这些功能的运行即可。右键单击导出 特征,然后在运行命令中再次使用作为代码复制到剪贴板,如上所示。将其粘贴到我们的方法中,然后对计算组 重复此操作。完整的方法应如下所示:

model.study(“ std1”).run();
model.result().export().run();
model.result().evaluationGroup(“ eg1”).run();

由于我们正在通过方法写入硬盘,因此我们可能还需要更改一些默认的安全首选项。进入文件菜单 > 首选项 > 安全性,并允许访问所有文件的文件系统。此设置显示在下面的屏幕截图中。否则,我们将只能写入临时 和 App 文件 位置,此部分通过文件菜单 > 首选项 > 文件进行指定。

A screenshot of the Preferences window opened to the Security options.
如果需要,修改安全性首选项以允许方法写入文件。

现在,当我们运行此方法时,将重新求解整个模型,并将新的数据和图像文件写出到硬盘。最后一步是从命令行完成所有操作,完全不使用用户界面。

从命令行运行

保存此修改后的文件,将其命名为 my_file.mph,然后退出 COMSOL Multiphysics 用户界面。打开 Windows 命令提示符,然后导航到包含模型文件的目录。确保将 COMSOL® 可执行文件的路径添加到 PATH 环境变量中,然后输入以下命令:

comsolbatch -inputfile my_file.mph -pname tbb,Vtot -plist“ 1 [cm]”,“ 10 [mV]”-methodcall my_method -nosave

此命令将打开模型,并通过 -pname-plist 变元的组合使用修改模型中的两个全局参数。当前情况下,参数 tbb 会更改母线板的厚度, Vtot 为所施加的电压。

我们自定义的方法将被调用(通过 -methodcall 变元),实现运行模型并写出数据。附加的可选变元 -nosave 表示不保存模型文件。有关此处所使用的和所有其他可选变元的完整详细信息,请参见《COMSOL Multiphysics 参考手册》中的 COMSOL 命令部分。

现在,修改模型和写出数据的整个过程都已经简化为一个命令了。

我们还能做什么?

当然,我们在这里所做的只是一个非常简单的示例,以演示运行模型和写出数据的自动化过程。其实我们还可以做很多工作。基本上我们可以将所需的任何代码放入模型方法中。例如,可以放入以下代码:

另外,值得一提的是,我们还可以使用另一种工作流程实现许多相同的数据提取,即通过作业序列功能 (此功能不需要使用方法)。

最后,需要说明的是,我们可以同时并行运行多个不同的批处理作业,当我们拥有一台配置大内存和内核的计算机时,这种方法尤其有效。

Microsoft 和 Windows 是 Microsoft Corporation 在美国和/或其他国家的注册商标或商标。

]]>
//www.denkrieger.com/blogs/how-to-run-comsol-multiphysics-from-the-command-line/feed/ 2
应对较小自动时间步的策略 //www.denkrieger.com/blogs/strategies-to-counter-small-automatic-time-steps //www.denkrieger.com/blogs/strategies-to-counter-small-automatic-time-steps#comments Mon, 16 Mar 2020 02:09:39 +0000 http://cn.staging.comsol.com/blogs?p=222661 在上一篇博客文章中,我们讨论了为向后微分法(Backward Differentiation Formulas,BDF)时间步进方法选择时间步和离散阶次的内在机理。这些机理旨在根据指定的容差获得精确解,并保持效率和鲁棒性的平衡。 当碰到较小自动时间步时,我们应采取哪些策略来提高仿真效率?在本篇博文中,我们列举了一些示例,并讨论了如何通过调整求解器设置来应对较小的时间步。

在求解器日志中追踪时间步和离散阶次

当使用 BDF 时间步进方法检查与时间有关的仿真求解器日志时,根据上一篇博客文章中描述的机理,BDF方法的阶次和时间步会发生变化。我们可能会出现以下三种情况之一:

情况 1:变化的时间步和离散阶次

从求解器日志中,我们发现 NLfail=0 Tfail=0(瞬态和代数求解器未记录任何失败),但是时间步长和离散阶次都在变化。

对于运行良好的模型,这是一个典型的场景并符合预期。当局部截断误差较小时,时间步长会增加。离散阶次的增加表示具有单调衰减的高阶时间导数的解很平滑。非线性的影响由代数求解器处理,并通过一些额外的代数求解器迭代或某些额外的雅可比(Jacobian)更新反映,但这不会以任何其他方式影响时间步进。

通常,我们不需要每次都调整求解器设置。但是,在我们的实际模拟中,总是存在一些风险:例如,容差太大以及解中的某些效应或细节会丢失;即使所有时间步都满足误差估计,仍无法求解。因此,减小容差并重新仿真是解决这个问题的一个好方法。这会使时间步变得更小并得到精度更高的解,代价是需要更多的 CPU 计算时间。另外,我们还需要注意的是,代数终止的准则与时间求解器的容差直接相关。因此,太大的容差不仅会影响时间离散误差,还会影响终止代数迭代的误差。

因此,在某些情况下,降低容差可以得到具有较好细节的解和更平滑的误差估计,但也会产生更大的时间步。这有点违背常理,因为在这些情况下,降低容差会使时间步进更有效(更快)。

示例:一维黏滞伯格斯方程(Burgers’ Equation)

考虑伯格斯方程

\partial_t u -c \partial_x^2 u +\alpha \partial_x u + \beta u\partial_x u = 0

将平滑的阶跃函数作为初始值,扩散系数 ,对流系数 和非线性对流系数

默认的求解器设置在齐次狄利克雷边界条件下,使用二次拉格朗日单元离散在区间 内求解。由于问题是非线性的,因此形成了一个黏滞冲击的解分布。为了确定合理的网格尺寸和容差,我们首先进行了网格收敛分析。

使用最大单元大小 (对应自由度为 ),相对容差 以及 855 个时间步,对于 ,得到一个参考解 。确定最大点误差 ,以及积分误差 。如果网格太粗糙或相对容差太大,则解中会出现可见的尖峰(参见下表中的红色数值;尖峰仅反映在 列中)。

# # # #
1e-2 106 1.5e-2 4.9e-1 8.1e-3 195 5.5e-3 1.6e-1 1.8e-3 272 9.3e-4 1.6e-1 1.7e-3 380 1.6e-3 1.6e-1 1.7e-3
1e-3 109 2.7e-2 4.2e-1 8.0e-3 246 6.0e-3 1.6e-1 1.8e-3 508 1.7e-3 2.1e-3 8.3e-5 904 9.0e-7 1.8e-4 3.7e-6
1e-4 109 2.7e-2 4.2e-1 8.0e-3 246 6.0e-3 1.6e-1 1.8e-3 461 1.7e-3 1.2e-3 8.3e-5 833 1.2e-8 3.8e-7 1.4e-6
1e-5 109 2.7e-2 4.2e-1 8.0e-3 246 6.0e-3 1.6e-1 1.8e-3 510 1.7e-3 1.3e-3 8.3e-5 855 9.8e-9 6.3e-8 3.5e-9

#表示时间步的数量。

从第一列可以看出,如果相对容差 太大,则较细化的网格无法减少误差,因此需要降低默认容差。我们还可以发现,当网格过于粗糙时,仅降低容差并不能减少误差。即使对于较小的容差,对于特定的网格尺寸,误差也会饱和。降低容差时,时间步的数量会增加(请注意,绝对容差与相对容差耦合)。在模拟过程中,耦合开始阶段时间步减小,之后略微增加直到结束。本例中,最大允许容差为 。对于足够小的容差,误差大小取决于网格分辨率。请注意,更细的网格并不会使时间步数量更多。

我们进一步发现,通过将容差因子从 1 减小到 0.1,可以减少时间步的数量(未在表中显示)。原因是在此设置下,代数求解器的容差较低,并且代数误差对瞬态误差的扰动较小。从求解器日志中,我们还发现 BDF 阶数一直保持为5,直到模拟结束(否则,由于存在代数误差,它会减小)。总的测量误差与计算较少的时间步时相比,大致保持相同水平。该示例很好地证明了使用更严格的容差可以得到更有效的(更快的)时间步。当求解 PDE(偏微分方程)时,如何同时考虑空间和时间误差,这也是一个很好的示例。

此示例中,在 TfailNLfail 中没有记录任何失败,并且 BDF 阶数从 1 迅速增加到 5,并且之后在 2~5 变化(当容差因子未减小时)。对于这个简单的示例,代数求解器运行良好。即使此求解器使用了更费计算资源的雅可比更新策略(每次迭代),我们也可以从恒定(牛顿)切换为自动(牛顿)并获得相同的运行效果。但是,对于自动高度非线性(牛顿)求解器,我们发现 NLfail 会迅速增加,并且平均每两步就会出现失败。原因是该求解器使用了一个保守的阻尼因子,即使对于良性问题,通常也不会在 4 次迭代中收敛。可以看出,这些失败如何将时间步减少到 1e-5s 而不是 1e-3s 的说明(需要 100 倍以上的步长!)。这是时间步性能的急剧下降。我们可以通过将完全耦合求解器的最大迭代次数从 4 增加到 6(从而使代数求解器有机会完成工作)来解决非线性求解器的失败和较小的时间步。

如果选择阻尼因子 ,最大迭代次数 限制为 2 的恒定(牛顿),也能经常观察到非线性求解器的失败。我们发现,此时时间步长变得比以前更小。当容差系数 增加到 10 时,NLfailTfail 中有失败记录。打乱代数求解器可能看起来很奇怪,但是它说明了代数求解器设置不正确会破坏瞬态求解过程。当 时(一个线性问题),这些报错仍然存在。进一步增大容差因子 只会在 Tfail 中产生误差(代数求解器会接受较大的误差)。

在 COMSOL Multiphysics 中绘制多个因变量的 x 坐标的图形
图表显示了时间步长如何随步长的倒数的变化而变化。

情况2:NLfail 大于零

从求解器日志中,我们发现 NLfail > 0。

瞬态求解器在每个时间步求解代数问题(可能是非线性的)。每次代数求解器失败时,NLfail 列都会递增。用于代数迭代的雅可比行列式(或雅可比矩阵)的计算成本相对较高,因此,默认情况下极少对雅可比行列式进行重新评估(最小化雅可比行列式)。如果代数求解器不收敛,则时间步减少,重新计算雅可比行列式(雅可比矩阵),并再次求解代数问题,该过程非常耗费计算资源。需要注意的是,由于时间步是雅可比矩阵的一部分,因此采用最小化雅可比行列式 策略也会导致线性问题无法收敛。

如果由于时间步太大而导致代数求解器失败,并且重复发生,那么我们可以在时间步进 设置中启用非线性控制器 来改善这种情况,从而可以更保守地控制时间步,特别是对于高度非线性问题。

如果代数求解器失败,首先,我们可以增加最大迭代次数。其次,在每次迭代(或至少每个时间步一次)中将雅可比更新 变更为。接着,再尝试不同的加速或增强方法。将安德森加速度(Anderson Acceleration)与分离代数求解器 结合使用将非常有效。如果可用内存允许,改用完全耦合 求解器可能效果会更好。对于完全耦合 求解器,降低恒定阻尼系数或使用自动 阻尼方法可能会有所帮助。

如果代数求解器仍然无法收敛,那么可以将求解器日志 更改为详细,从而获得各个因变量的误差估计(该功能自 COMSOL Multiphysics® 5.5 版开始)。此信息不仅会打印到日志视图,而且还会在单独的收敛图 窗口中显示。有了这些信息,我们就可以找出哪个变量在代数误差中起主导作用,使我们更深入地了解收敛问题。请注意,因变量的误差权重受缩放比例和该变量绝对容差选择的影响。

另一个直接影响代数求解器终止的重要参数是容差因子。数值1意味着代数问题的终止准则与局部时间步误差完全相同。一些物理场接口将此因子修改为较小的数。增加此因子可以更容易地实现收敛准则,但是同时存在代数误差扰动解的风险。因此,选择此因子时需要格外小心。

代数求解器的失败也可能是由线性求解器的失败引起的。线性求解器具有自动 错误检查机制,可防止代数求解器终止。如果“日志” 窗口中 LinErr 和/或 LinRes 列的数字不够小,可能会产生这个问题。为了验证实际情况,我们可以将线性求解器的检查误差估计 (误差 栏下)设置为 。一旦存在无法在所需精度求解的线性矩阵问题,将停止时间步进并显示错误。

对于直接 线性求解器,我们可以尝试通过启用迭代求精(请参见直接线性求解器的错误栏)和 在非线性求解器中使用 选项来改善情况。对于迭代线性求解器,可以通过增加误差估计中因子 来简化终止准则,但是必须谨慎行事,否则会产生更多代数误差而扰动解。

对于迭代 线性求解器,请注意 LinErr LinRes 的数值。如果这些数不够小,则可能存在预处理器无法精确求解矩阵的问题。首先,我们可以检查线性迭代求解器设置是否真正用于求解的矩阵,而不是尝试调整预条件器(使用显示默认求解器)。

示例:多匝线圈的磁场

让我们使用带有二阶单元的“磁场”接口研究正弦电流激励的多匝铜线圈的时变磁场。示例铜线圈被空气包围,并由一个软铁片悬挂,该铁片具有非线性本构关系(非线性 B-H 曲线)。

铜制多匝线圈的3D模型
铜制多匝线圈的 2D 模型

将瞬态求解器的时间列表设置为 range(0,0.1,10),并将默认求解器设置为(完全耦合恒定(牛顿)直接最小雅可比更新),正弦线圈激励设置为 10A,我们发现,解扩展至5个周期(在时间为 10s 时结束)使用了大约 100 个时间步实现。需要注意的是,这种物理场的默认时间步方案使用中级作为求解器采取的步长设置。因此,根据指定的输出时间,将时间步长的上限设置为 0.1s。这可以通过检查求解器日志来查看。如果将激励增加到30 A,则需要降低输出时间的上限值(例如,总共需要约 200 个时间步至 0.05s),否则无法得到收敛解。

下面,让我们来详细地研究 40A 线圈激励的时间步轨迹。通过输出时间降低最大时间步约束的策略似乎没有效果(即使步长约束降低至 0.001s 也无效)。对于时间 设置为 range(0,0.05,10) 的情况,我们发现 NLfail 有很多失败,并且求解器在 109 个时间步后确实放弃计算,并显示了一条错误消息:

20个时间步的求解器日志的屏幕截图

从90到109个时间步的求解器日志的屏幕截图

激励为 40A,输出间隔为 0.05s 时,多匝线圈模型磁场的求解器日志和默认设置。

我们可以在上图中最后一行找到失败的原因:10 次重复 NLfail。当出现 10 次错误后,求解器在进行下一步前放弃工作。此时,它已将时间步缩短 1/4 的工作重复了 10 次,对应的时间步缩小了 1,000,000 倍。此时,步长大小可能不是关键的问题。对于每次尝试,非线性求解器都不会在最大迭代次数内收敛。

我们正在模拟五个完整的线圈电流周期,即 10s。对于零线圈电流,矢势为零,因此我们需要仔细考虑比例。我们可以检查日志并看到磁矢势已自动设定为“1”。通过绘制求解器停止工作时的矢势,此时电流不为零交叉处,我们可以将磁矢势的量级估计为 1e-2 Wb/m。由于是根据解的范数,通过自动缩放的默认值来更新绝对容差,因此最好改为手动缩放矢势。

更改求解器设置的策略

按照上述情况 2 的建议,我们更改了求解器设置:

  1. 将磁矢势更改为“手动缩放”,更改为 1e-2。再次尝试,没有任何改善。
  2. 完全耦合 求解器的最大迭代次数 更改为 10。再次尝试,没有任何改善。这似乎是一个非线性的问题。
  3. 雅可比更新 策略更改为每个时间步一次。再次尝试,我们发现在大约 200 个时间步内得到解, NLfail 没有报告任何失败(但我们仍然无法放开时间步限制)。
  4. 雅可比更新 策略更改为在每次迭代。再次尝试,我们发现该措施确实有效!现在,即使使用 自由 时间步进,我们也可以在 28 个时间步内完成求解(误差稍大,但误差估计仍满足规定的容差)。
  5. 接下来,我们需要问自己,采用中级 时间步进以及最大步长为 05s 时的结果是否准确。除了在零交叉处(t=0.5s 的倍数)矢势的计算值为 1e-16 Wb/m 外,矢量势的计算值约为 1e-2 Wb / m。因此,缩放比例似乎是正确的策略。复制上面的解以供参考,并用更严格的公差进行新的计算。
  6. 将研究中相对容差 更改为 0001,进行收敛性检查,注意相应的绝对容差也将减小。通过对缩小 100 倍容差的问题进行求解,我们对该模型进行了严格而良好的鲁棒性测试。大约需要 200 个时间步,并且代数迭代也要多 5%。NLfail Tfail 没有出现失败。此计算结果与上述复制解的标称误差约为 1e-5 Wb/m,因此我们可以得出结论,时间离散具有较小的误差。本文未考虑空间误差。
  7. 激励为100 A时,即使求解器设置已经调整且最大时间步为 0.05s,中级 时间步进和和默认容差仍会产生误差小于1%的结果。

在该实验中,我们发现默认的求解器设置对于10A激励而言是完美的。如果打开激励,则非线性效应会更强。对于求解器而言,这是在低成本和鲁棒性之间进行权衡的问题。在非线性更强的情况下,我们必须手动提高鲁棒性。另一方面,在较低激励的情况下,设置更多的鲁棒性会降低性能。

情况3:Tfail 大于零

从求解器日志中,我们发现 Tfail > 0

采用瞬态求解器得到时间步失败意味着不满足相对于容差的误差范围,并且需要以较小的时间步来重复计算。通过前面描述的机制确定新的时间步,对于每个失败,Tfail 列都会递增。这可以被视为时间步失败控制器,因为它不能正确预测局部误差的变化。

当务之急,我们应该缩小时间步并重新计算。如果是由于一个不容易预见的瞬态解(由于其非常瞬态的性质)而发生这种情况,则可能难以改进(在所采取的步骤中未加任何控制)。另一方面,如果这种情况定期发生且没有任何瞬态解,则存在改进的空间。

一个常见的原因是误差估计不平滑,因此其误差逐步变大。这可以通过低阶(使用 BDF 求解器)来证明。有时,降低相对容差 或 减小代数容差因子以减少代数错误是一种补救措施。求解PDE问题时,还可能是由于空间网格太粗糙。可以通过细化网格或引入更多的空间稳定性进行补救。此外,还有最后一种措施是改用“手动” 控制时间步进(这对于 Tfail 是不可能的,但是也没有误差控制)。进一步的选项包括使用较小的初始步长 或 在时间步 部分施加最大步长约束

NLfail Tfail 还可能都增加。代数求解器的错误可能与时间步的选择机制错误有关。在这种情况下,代数求解器和时间步机制都应进行调整。但是,只有在问题解决得当的情况下,该策略才能成功,否则所有的措施都将无效。

示例:流体阻尼器

流体阻尼器案例模型是一个阻隔冲击或抑制由地震和风力引起的震动的装置。该模型模拟了设备中的黏性加热现象。

该模型很好地演示了模拟过程中时间步如何变化。使用默认求解器设置,将记录多次 Tfail 失败。

图示模拟了时间步长如何变化
该图显示了流体阻尼器模型的仿真结果。

让我们看看如何防止这些失败以及如何提高仿真性能。由于周期性的载荷,流体可以上下交替运动。这意味着速度和压力梯度场将改变方向并通过一个零交叉(在短时间内所有自由度)。在这种情况下,绝对容差的自动更新会导致复杂化,因为绝对容差将在转折点附近获得非常小的值。通过日志检查并将其与活塞的周期性位移进行比较,可以发现 Tfail 发生在这些点附近。另一方面,量级变化很大。

我们想到的第一个策略是:在“绝对容差”部分中的瞬态求解器上关闭更新缩放的绝对容差复选框。但这是行不通的。注意,在代数变量设置 部分,所述误差估计 被设置为排除代数压力(comp1.p)容差因子 设定为 0.05。

我们尝试在“因变量”节点下的变量 节点上使用手动缩放。在“缩放比例”部分中将“方法”设置为“手”,压力使用比例 1e7,温度 使用 1e2,速度 使用 1e1。另外,压力和温度的容差系数为 0.1,速度的容差系数为 0.5。此时,不会出现 TFail,但是出现了 6 个 NLFail。相比于原来的 1300 个时间步,该设置仅使用了约 400 个时间步。例如,通过将分离 节点上的最大迭代次数设置为 15,并将 Anderson 加速度的迭代空间维度 设置为 8,可以降低 NLFail。这些更改节约了大量计算时间。

示例:放大电路中的电感器

放大器电路中的电感器示例演示了如何将电路仿真与有限元仿真结合起来。这是一个通过调整容差因子 来优化时间步进方案的示例。在这种情况下,对于雅可比更新 ,具有最小设置的额外代数步进足以节省工作。使用存储在模型中的求解器设置,我们发现 170 步就可得到研究 2 的稳态和瞬态解,出现 10 个 TFail 和 1 个 NLfail

通过将容差因子 降低到 0.1 并将最大迭代次数 增加到 6,我们发现步数减少为 127(出现 2 个 TFail 和 0 个 Nfail),而无需更改雅可比更新设置。其余的 Tfail 来自初始步长。也可以通过将初始步长降低到 1e-9s 来避免这些错误。但是,这样做效果不佳。对于此示例,可以使用更严格的容差来显著提高求解效率。

结论

本篇博客文章中,我们介绍了一些提高仿真效率的策略,包括在求解器设置中如何“旋转按钮”以及可以从瞬态求解器日志中获取什么信息。有关这些主题的更多内容,可以从 COMSOL 知识库中获取。

相关资源

阅读以下 COMSOL 知识库中的文章,了解更多相关信息:

]]>
//www.denkrieger.com/blogs/strategies-to-counter-small-automatic-time-steps/feed/ 10
如何在 COMSOL Multiphysics® 中进行灵敏度分析 //www.denkrieger.com/blogs/how-to-perform-a-sensitivity-analysis-in-comsol-multiphysics //www.denkrieger.com/blogs/how-to-perform-a-sensitivity-analysis-in-comsol-multiphysics#respond Thu, 06 Feb 2020 02:41:57 +0000 http://cn.staging.comsol.com/blogs?p=290601 几乎所有工程领域都使用仿真在虚拟环境中来预测组件的性能。然而,这并不是仿真技术的唯一优势。了解影响组件性能的主要因素能够赋予设计过程更多价值。在 COMSOL Multiphysics® 软件中进行灵敏度分析是理解这种关系的一种方法。今天,我们将展示如何在一个承受弯曲和扭转载荷的桁架塔中使用 COMSOL 软件的 灵敏度 研究步骤进行分析。

什么是灵敏度分析?

如果你曾经研究过更改模型中某个参数会带来什么影响,那么基本上你已经对该参数进行了灵敏度分析。这些参数可以是材料特性、载荷或几何距离。在两种情况下,对灵敏度进行研究很重要:

  1. 你需要描述响应对输入数据的不确定性的敏感程度;例如,制造容差或材料特性
  2. 你需要更改参数以提高设计的性能,并希望找出最有效地实现目标的更改

显然,如果参数扰动很大,响应的改变会更大,因此将所测量的任何变化除以参数扰动的大小,来获得标准化的灵敏度测量值是有意义的。然后,再将这个归一化的数字与以相同方式计算的其他参数的类似数字进行比较,假设这些参数在某种程度上是等效的并且具有相同的单位。

这种(或多或少通过手动进行的)灵敏度分析称为 前向差分分析 ,其计算成本与参数数量成正比。它最适用于参数数量较少的情况。然而,选择参数扰动的大小可能有点棘手,因为它必须足够大以避免数值噪声,并且应足够小以避免非线性效应。

你可以通过增加和减少参数来获得所谓的 中心差分 来提高分析的准确性,如下图所示。从计算的角度来看,这需要花费2倍的时间,因为你必须对两个新参数值计算模型,而不是一个。

在数学上,灵敏度可以看成是对一个或多个输入参数的求导结果。上述我们讨论的两种方法是最常见的近似求导法。

显示使用伴随灵敏度分析执行的中心差异方案的图。
可以使用灵敏度分析以及正向或中心差分相结合的方法来计算曲线的斜率。

然而,灵敏度分析是 COMSOL Multiphysics 中的内置功能,因此你无需自行扰动参数。你可以使用伴随灵敏度分析来避免一些相关数值参数带来的参数扰动,结果以单一线性解的代价来计算灵敏度。从概念上讲,你可以把它看作使用分析方法计算所导数,而不是通过有限差分对它进行近似。这个功能可用于稳态和频域研究类型,只要参数不改变网格就可以使用。

在这篇博文中演示的示例中,我们将使用伴随灵敏度分析,因为考虑的问题有很多参数。

桁架塔的弯曲和扭转

想象一个底部固定的桁架塔,顶部承受扭转和弯曲载荷,如下图左侧所示。该模型使用不包含旋转信息的桁架单元。但是,计算倾斜度和扭转度需要这些信息。

该模型使用梁单元(在下图右上方显示为黑色十字)来测量倾斜度和扭转度。

并排图像显示了桁架塔的弯曲和扭转以及倾斜和偏航。
弯曲和扭转载荷工况(左)以及使用 4 个顶部节点位移计算的偏航和倾斜变形的定义(右)。

下表列出了扭转和弯曲载荷工况的倾斜度和扭转度:

载荷工况 倾斜度(°) 扭转度(°)
弯曲 0.72 0
扭转 0 1.2

在 COMSOL Multiphysics® 中执行灵敏度分析

我们将研究该塔对单个梁横截面积变化的敏感程度。通过为每个梁创建一个控制变量来实现这个研究,该变量可用于调节梁的横截面积。在 COMSOL 中我们使用边控制变量场 Abar 来实现。COMSOL Multiphysics 的核心功能包含 灵敏度 研究步骤,我们需要在“显示更多选项 ”对话框中启用并添加这项功能。

显示如何在 COMSOL Multiphysics 中启用灵敏度研究步骤的屏幕截图。
可以从 显示更多选项 中启用 灵敏度 研究步骤

控制变量将自动显示在灵敏度研究步骤中,但必须使用探针或积分耦合算子定义目标函数。无论哪种情况,我们都可以在灵敏度研究步骤中输入目标函数,如下图所示。

显示如何在灵敏度研究步骤设置中添加目标函数的屏幕截图。
倾斜目标被定义为一个变量,因此它可以直接写入 目标函数 表格或使用 添加表达式 按钮添加。

灵敏度分析的结果

对于控制变量的灵敏度,我们可以使用表达式 fsens(abar) 绘制,如下图的倾斜灵敏度所示。对于弯曲载荷工况,如果对垂直梁进行加固,倾斜度将会降低,尤其是在塔的下部。右侧为扭转载荷工况,我们可以看到塔的倾斜对梁区域的变化不敏感。

弯曲和扭转载荷工况的敏感性分析结果图。
绘制了弯曲载荷工况(左)和扭转载荷工况(右)下的倾斜灵敏度。

扭转灵敏度如下图所示。我们可以通过在一侧加固对角梁,同时在另一侧削弱对角梁,为弯曲荷载工况引入扭转度。这样做会破坏对称性,使塔顶响应弯曲载荷而扭转。对于扭转载荷工况,可以通过加强对角梁来减小扭转度。

弯曲和扭转载荷情况下偏航灵敏度的仿真结果。
绘制了弯曲载荷工况(左)和扭转载荷工况(右)的扭转灵敏度。

倾斜度和扭转度对水平梁的变化都不敏感,这表明可以移除它们,从而降低结构的成本。然而,这将导致垂直梁的长度加倍,结构将变得更容易受到局部屈曲的影响。

下一步

尝试自己进行灵敏度分析。单击下面的按钮转到 COMSOL“ 案例库”,其中包括用于桁架塔模型灵敏度分析的 PDF 文档和 MPH 文件。

]]>
//www.denkrieger.com/blogs/how-to-perform-a-sensitivity-analysis-in-comsol-multiphysics/feed/ 0
如何使用 COMSOL 进行电磁热分析? //www.denkrieger.com/blogs/which-study-type-should-i-use-for-my-electrothermal-analysis //www.denkrieger.com/blogs/which-study-type-should-i-use-for-my-electrothermal-analysis#comments Mon, 13 Jan 2020 01:46:16 +0000 http://cn.staging.comsol.com/blogs?p=220221 研究电磁仿真的工程师或研究人员,可能感兴趣的第一个多物理场耦合就是电磁(EM)热。无论是需要热量,还是要避免因电磁损耗而产生的热量,电气设备的性能几乎总受温度影响。在本篇博文中,我们将讨论如何使用 COMSOL Multiphysics® 软件中电磁接口的内置研究类型在低频和高频范围内进行电磁热分析。

电磁损耗的热源计算

电磁损耗的热源有多种类型。我们可以使用 COMSOL Multiphysics 软件的内置功能计算所有的电磁热源(准静态或高频状态)。软件中预定义的接口包括焦耳热感应加热微波加热激光加热

焦耳热

焦耳热 多物理接口耦合了固体传热电流 接口(AC/DC 模块)。它考虑了由传导电流和介电损耗产生的热量。

使用COMSOLMultiphysics®中的焦耳加热界面的电阻设备模型图。
使用 焦耳热接口模拟电阻装置。

添加为热源添,在频域中, 或在时域中,

在频域中,采用电导率(σ)和复数相对介电常数(ε”) 表示材料的损耗:

感应加热

感应加热多物理接口耦合了固体传热磁场 接口(AC/DC 模块)。它考虑了由感应电流和磁损耗产生的热量。

使用感应加热建模的带有交流线圈的铁磁芯的图形。
使用感应加热接口对交流线圈中的铁磁体芯进行建模。

添加为热源项,在频域中,;在时域中,,而 Qml 与磁滞模型有关。

在频域中,用电导率(σ)来表示材料的电阻损耗并对 B 和 H 的关系进行线性化处理,用复磁导率(µ”)表示材料的磁损耗:

微波加热

微波加热 多物理接口耦合了固体传热电磁波频域 接口(RF 模块)。它考虑了高频状态下由电阻、电介质和磁损耗产生的热量。

使用“微波加热”界面建模的微波炉的图形。
使用 “微波加热”接口 对微波炉进行模拟

添加为热源项,在频域中,。如上图所示,在频域中,用电导率(σ),复磁导率(µ”)和复相对介电常数(ε”)表示材料损耗。

激光加热

激光加热 多物理接口耦合了固体传热 接口与电磁波,波束包络波动光学模块)。它考虑了在高频状态下由电阻,电介质和磁损耗产生的热量。

使用激光加热界面建模的入射高斯光束的图形。
使用 激光加热接口对入射高斯光束进行建模。

添加为热源项,在频域中,。如上图所示,在频域中,用电导率(σ),复磁导率(µ”)和复相对介电常数(ε”)表示损耗的材料特性。

上面我们介绍了 COMSOL 软件中所有多物理场接口的频域公式,以及低频(AC/DC 模块)接口的时域公式。同时,为了完整描述损耗,焦耳加热 接口了考虑了介电损耗(用 ε” 表示),尽管这种损耗通常仅在高频状态下才重要。

材料中的磁损耗取决于 B 和 H 之间的非线性关系。通过时域中的完整磁滞回线可以完整地描述这种损耗,但 μ’’ 是在频域中量化磁滞损耗的一种便捷方法(见下图)。对于具有明显磁滞损耗的时域模拟,磁滞 Jiles-Atherton 模型 选项可作为本构关系在第一个物理子节点 中使用。

电感器
默认的磁场模型本构关系为相对磁导率。

相对磁导率是默认的磁场模型本构关系。在电感器三维建模案例教程中,空气域使用了默认关系,其值为常数并设置为实数 1。在空气域内某点绘制的 B-H 曲线呈线性。铁磁芯使用磁损耗本构关系和磁导率的复数分量表示,代表磁滞损耗的量。在核心区域内的某点绘制的 B-H 曲线呈椭圆形,且具有磁滞回线的特征。

电磁热分析的关键:时间尺度

在仿真过程中,交流激励的主要优点是在有复值解的频域中通过稳态公式进行求解。但我们可能希望观察到:设备温度随时间如何变化,甚至电学特性如何随时间或温度变化。这是否意味着我们只能使用瞬态研究类型模拟电磁热?

与替代方案相比,使用瞬态公式来解决时谐电磁问题的计算成本非常高。尤其是,如果我们认为电磁循环发生在毫秒或纳秒尺度上,而温度上升可能需要几分钟或几小时,这些就会成倍增加成本。那么,如何在合理的时间内解决此类问题呢?

使用 COMSOL® 软件中的内置研究类型进行建模时,我们根本不需要求解完整的瞬态问题,而只需要通过单向耦合或分离双向耦合的方法即可解决。假设电磁的循环时间比热时间尺度短,我们可以将问题分解为几个步骤。第一步,计算电磁损耗。对于交流信号,我们通过解决频域中的电磁问题,获得周期平均损耗。第二步,将这些损耗作为恒定的热源插入项,解决稳态或瞬态传热问题。

通过两种方法解决简单电阻器的焦耳热问题:使用瞬态研究类型和频域-瞬态研究类型(左)。第一种情况,我们可以绘制电流和电磁损耗随时间的变化曲线。如果电磁循环时间比热时间尺度短,则完整瞬态方法计算成本高且不必要。我们可以在频域中获得周期平均的电磁损耗,并将这些值用作瞬态传热问题中的连续热源。对比电磁循环内完整瞬态和频域-瞬态研究类型之间的温度解(右)。可以看到,瞬态解在温度上会出现小幅振荡,但两种解决方案都遵循相同的总体趋势。

时谐电磁热问题的研究类型

对于时谐电磁热问题,我们可以从以下四种研究类型中选择:

  1. 频域-稳态
  2. 频域-瞬态
  3. 频域-稳态,单向耦合
  4. 频域-瞬态,单向耦合

前两种研究类型与单向耦合类型的区别是什么?

严格来说,单向耦合研究类型的研究过程分两个步骤,并且是两个物理场之间单向耦合的最佳选择。对于此类型研究,可在频域中解决电磁问题,并计算出周期平均损耗。在随后的稳态或瞬态传热研究中,可将这些损耗作为热源插入项。单向耦合研究类型使用的时间和计算资源更少。

通常,我们更常使用“频域-稳态”和“频域-瞬态”研究类型处理更复杂的问题,例如与温度有关的材料属性。在这些研究中,使用分离双向耦合求解的方法,在电磁和传热问题之间反复迭代,直到满足收敛标准为止。当软件检测到足够大的温升,并且材料特性发生显著变化时,将使用新的数值重新计算电磁损耗和温度场,重复这个过程直到收敛。

我们在这里使用了许多相关术语。那么,多少温升才被认为足够大?什么是材料特性的显著 变化?这由研究设置中指定的相对容差确定。根据所需的精度,默认容差是个不错的起点,甚至可能比需要的值更严格。默认的物理控制网格也是合适的,因为软件可以基于物理场和研究设置有根据的推测单元类型和大小。例如,在计算电磁波时,软件会根据建议的每个波长至少 5 个单元的标准,自动确定在研究节点中输入频率的波长(在每种材料中)和大小。尽管自动设置是个很好的起点,在常规的网格细化研究外,还需要容差细化研究来验证结果。

微波加热案例教程是一个单向耦合的示例,因为它不包含任何与温度相关的材料特性。与单向耦合方法相比,“频域-瞬态”研究类型占用的内存是其 2 倍以上。虽然两种方法都可以得到相同的解,但频域-瞬态研究的计算时间是单向耦合方法的4倍以上。

射频加热案例教程是一个分离式双向耦合求解的示例。该模型具有两个与温度相关的材料属性:

  1. 导热系数
  2. 损耗角正切,损耗角

具有上述一种特性,就必须进行双向耦合。你能猜出哪一个吗?

 

左:“射频加热”教程是双向耦合问题的示例。计算电磁损耗需要使用损耗角正切,损耗角(δ)材料属性,它们随着温度线性变化。 将电磁损耗作为热源,将会增加随温度变化的 δ 值。反过来,δ 值增加会导致电磁损失增多,并且该循环会重复进行直到达到稳定状态。右: Ez 在相位上的变化,电介质的体积图显示了固定时间为 120 分钟时电磁的损耗量。电磁循环周期发生在 0.1 纳秒的周期内。

导热系数属于传热部分,因此进行单向耦合效果较好。而损耗角正切属于电磁问题,且随着传热问题的温度解而变化,因此必须进行双向耦合。

 

 

电介质中的总电磁损耗和温度随时间的变化,按求解器的步骤存储解。损耗和温度都随时间增加,然后随着系统稳定而趋于稳定。频域-稳态研究表明,稳态温度约为 328.3K。

无论是对温度曲线的瞬态还是稳态解感兴趣,我们都可以通过选择适当的研究类型来解决物理场耦合问题。上面,我们经讨论了交流加热的研究类型,接下来,我们将讨论减少直流电流加热计算时间所能作的假设。

直流电问题

在默认情况下,物理接口的方程式设置为“研究控制”。这意味着对于瞬态电磁热研究,电流方程将是瞬态的,其中包括电位移场的时间导数。在大多数情况下,电流流过导电性能良好的导体时,∂D/∂t 项可以忽略不计,并且可以通过删除该项,来节省计算资源。此时,我们可以在”电流(ec)”节点的“设置”窗口,将方程式强制设置为稳态

为了比较不同仿真需求的方程式设置,我们对芯片上排列的键合线使用焦耳热进行了研究。在研究中,我们同时执行了单向耦合(不依赖于温度的材料特性)和双向耦合(依赖于温度的线性电阻率 传导电流模型)。在这两种情况下,采用两种公式都可以获得相同的解,但是当使用稳态公式解决电流问题时,仿真需要的时间更少并且占用的内存更少。本示例在计算上相对较简单,但稳态电流公式(如果可能)更适用于求解计算更复杂的问题。

在 3D 几何图形上绘制温度分布,并使用各种公式计算最高温度。 “ec” 是指电流(公式)。

结语

本篇博文介绍了简化电磁热分析的各种研究类型。在交流电流情况下,频域-瞬态,单向耦合和频域-稳态,单向耦合研究类型是解决单向耦合问题的首选。而使用频域-瞬态和频域-稳态研究类型可以处理双向耦合问题。

在直流情况下,我们可以忽略电流方程中与时间有关的项,但仍然可以获得准确的温度解,并减少计算时间和资源。

无论问题多复杂,请最好先从单向耦合入手,以确保模型在引入温度相关特性之前能够正常启动并运行计算。通过分步骤的工作,我们可以更有效地识别和纠正潜在的错误源。祝您建模愉快!

下一步

如果您对电磁加热建模有任何疑问,请随时与我们的技术支持团队联系:

了解有关电磁加热的更多信息,请阅读 COMSOL 博客文章 :

]]>
//www.denkrieger.com/blogs/which-study-type-should-i-use-for-my-electrothermal-analysis/feed/ 44
如何在声学仿真中使用求解器建议 //www.denkrieger.com/blogs/how-to-use-solver-suggestions-in-acoustics-modeling //www.denkrieger.com/blogs/how-to-use-solver-suggestions-in-acoustics-modeling#respond Fri, 30 Aug 2019 06:49:06 +0000 http://cn.staging.comsol.com/blogs?p=310321 在对大型工业规模的声学问题进行建模时,使用手头的硬件有效地解决这些问题可能具有一定的挑战性。即使在优化网格、利用对称性和使用其他建模技巧之后也会发生这种情况。一个重要的、有时会被忽视的技巧是使用自动生成的迭代求解器建议。这些建议往往比默认求解器更节省内存,甚至更快。这篇博客,我们探讨了求解器建议的使用,以及它们如何在声学模型中发挥作用。

求解器建议简介

当使用 COMSOL Multiphysics® 软件的附加产品——声学模块中的任何物理场设置和求解模型时,会生成所谓的求解器建议。这些是预定义的求解器(通常是迭代求解器),我们在其中进行了所有必要的设置,以使它们适用于选定的单物理场或多物理建模场景。

大多数物理场接口中使用的默认求解器是直接求解器,对于所有适合你机器上可用内存的中等问题,它都是高效且稳健的。但是,当模型变得很大时,可能会耗尽内存。在这种情况下,其中的一个求解器建议可能会帮到你。

通常,当增加声学模型中的频率并需要相应地细化网格时,你将需要其中一个求解器建议。如果你决定对某些狭小的声学区域使用更详细的模型,如热黏性声学,以便对损失进行更详细的建模,也会发生这种情况。

COMSOL Multiphysics® 中的求解器建议屏幕截图。
求解器建议在模型开发器中的外观示例。

那么,如何选择和启用求解器建议?有以下几个重要步骤:

  1. 右键单击感兴趣的研究,然后选择显示默认求解器
  2. 展开求解器配置稳态求解器 节点(对于瞬态模型,将会展开瞬态求解器 节点)
    • 在这里,将看到正在使用的求解器(已启用,通常称为建议的直接求解器 (标签))
    • 还将看到禁用的建议迭代求解器(描述)(标签)(可能有多个)
  3. 右键单击并选择 启用(或按 F4),启用迭代求解器

在上面的列表中,标记 是生成求解器建议的物理场或多物理场耦合的标签(或简称)。例如,压力声学将含有标签 acpr。如果你正在求解声-结构相互作用 (ASI) 问题,标签 asb1 将来自声-结构边界 耦合特征。

在模型开发器树中的紧邻物理场或多物理场耦合的位置可以看到标签。这些建议还包括对所使用的求解器设置的简短描述;例如,带有 GMRES with GMG(见上图)表示 GMRES 迭代求解器与(几何)多重网格预处理器。各种求解器的详细信息可以在 声学模块用户指南 的“Modeling with…”部分看到。在这篇博客中,我们不会详细描述所有求解器建议,而是介绍相关内容。

选择显示默认求解器 命令后,模型中的物理场接口和多物理场耦合将被分析。求解器建议是基于物理场接口的,每个接口都有一个建议,如标签所示。如果使用多物理场耦合,则会为耦合问题生成一个建议(显示耦合特征标签)。这也意味着,如果对模型进行更改(例如添加额外的物理场并使用多物理场耦合进行耦合),那么必须重新生成求解器。这一步很重要,最好通过右键单击 节点(例如,解 1)并选择将求解器重置为默认设置 来完成。也可以选择建立一个新的研究,并在这时生成默认求解器。

在某些特殊情况下,需要特别注意并进行一些手动设置,例如手动耦合不同的物理场或将集总电路模型与有限元模型做结合。下列几个用于传感器建模的案例教程模型就使用了这个策略:

对于手动耦合物理场接口的情况,COMSOL® 软件将默认使用分离式求解器方法。这种策略在一些情况下会有用,但如果模型是强耦合的,则不会起作用。这时,必须切换到全耦合 求解器,如上面列出的三个示例所示。

模型开发器中的求解器配置屏幕截图。
求解器配置在具有全声振耦合模型的集总接收器中扩展。

COMSOL Multiphysics 的每个新版本都会更新声学模块中建议的求解器,它在适合的情况下采用了最新的求解器技术,并改进了单物理场和多物理场问题的分析方式。COMSOL 希望使建议的求解器尽可能稳健和高效。

尽管这篇博客是专门为声学应用写的,但其他物理领域也会产生求解器建议,包括结构力学、传热和 CFD。

这里我们学到的最重要的经验是,每当对模型进行更改(通过添加物理场或引入新的耦合)时,通常都必须更新或重新生成求解器。在下一节中,我们将演示两个求解器建议用于声学应用的模型示例。

2  使用求解器建议的声学模型

第一个示例,我们来看一个声-结构相互作用问题,敞开式扬声器箱中的驱动器教程模型。下面的视频展示了如何为这个模型选择建议的迭代求解器。

 

在敞开式扬声器箱中的驱动器教程模型中的激活迭代求解器建议。

从默认直接求解器切换到建议的迭代求解器时,能提升多少速度和节省多少内存?当然,这取决于你可以使用的硬件和模型大小。本例中的模型是在一台已经使用了三年的3.6 GHz(4 核),32 GB 内存的 Intel® Core™ i7-4790 CPU 台式机上求解的。

求解 3500 Hz 的扬声器模型(使用适当的网格)需要 8 GB 的内存,使用默认的直接求解器需要 64 s。使用建议的迭代求解器,需要 4.7 GB 内存并需要 63 s(求解 3.8e5 自由度)。将频率提高到 5000 Hz(通过将模型中的网格参数lambda_min343[m/s]/3500[Hz] 更改为 343[m/s]/5000[Hz])需要 18.8 GB 内存,默认直接求解器需要 243 s,而使用建议的迭代求解器,则需要 6.8 GB 内存, 87 s(求解 8.3e5 自由度)。因此,随着模型大小的增加,速度的提升和内存的节省会相对增加。

在第二个示例中,我们解决了一个更大的热黏性声学问题:穿孔板的转移阻抗教程模型的变体。在 COMSOL 案例库中,该模型有两个版本:一个分析四分之一的穿孔(使用对称性,称为 transfer_impedance_perforate.mph),另一个对整个穿孔进行建模(称为 transfer_impedance_perforate_withDD.mph)。有关不同求解器建议的性能和简短描述,请查看 PDF 文档

 

穿孔板的转移阻抗教程模型中激活的迭代求解器建议。

下一步

想要详细了解声学模块如何满足你的分析需求吗?请联系我们,了解有关 COMSOL 软件的更多信息。

更多资源

]]>
//www.denkrieger.com/blogs/how-to-use-solver-suggestions-in-acoustics-modeling/feed/ 0
瞬态问题中的自动时步和阶数选择 //www.denkrieger.com/blogs/automatic-time-step-and-order-selection-in-time-dependent-problems //www.denkrieger.com/blogs/automatic-time-step-and-order-selection-in-time-dependent-problems#respond Thu, 20 Jun 2019 02:19:30 +0000 http://cn.staging.comsol.com/blogs?p=266741 当追踪瞬态仿真日志时,您可以观察到求解器使用了不同的时步和离散化阶数。在仿真过程中,您可能会发现时步变小,求解需要很长时间才能完成。本篇博文,我们将讨论选择时步和离散化阶数的原则。在接下来的一篇博文中,我们将说明在时步较小的情况下,应该采取哪些措施来提高仿真效率。

瞬态仿真

瞬态仿真需要计算反映时间演变的离散解。从初始值开始,通过时间积分方案确定未知的瞬态自由度。如果一个时步的计算解满足给定容差下的预定义误差边界,那么该解被接受。自适应时步算法可能会使用太大的时间步长,导致已采用的步长计算结果不会通过误差测试。在这些情况下,时步会减小,并且会重复计算该时步。如果非线性求解器不能在最大迭代次数内求解代数方程,时步也会减小。这两种方案都需要额外的计算,因此会导致瞬态仿真超过最优时间。

这篇博文旨在帮助您理解求解方案背后使用的机制,并帮助解读求解器日志中提供的信息。在这篇博文的后续文章中,我们将利用对这些机制的理解来举例说明,当遇到小时步时,我们如何使时间步进更加高效和稳定。下面,我们先来看看求解器日志,看看能从中了解到什么。

瞬态求解器日志

瞬态求解器的典型求解日志如下所示:

Step Time Stepsize Res Jac Sol Order Tfail NLfail LinErr LinRes
0 0 -out 2 3 2 0 8e-14 3.5e-15
1 0.1 0.1 11 5 11 1 0 1 2.6e-16 2.4e-16
... ... ... ... ... ... ... ... ... ... ...

日志显示了当前 Time 的时间积分循环迭代计数器 Step,其中 Stepsize 是当前时步的大小。接下来的三列详细说明了残差(Res)的总数,雅可比组装(Jac)的总数,以及线性代数系统解( Sol)的总数。

在这篇博文中,我们感兴趣的是观察时间步进方案的离散阶数(Order),自适应步长选择的失败次数(Tfail),以及代数(非线性)求解器的总失败次数(NLfail)。我们将在接下来的章节中讨论这些失败的含义。根据线性代数系统误差估计(LinErr)和线性代数系统残差( LinRes)的大小,可以看到每个时间步的最后一个线性问题的解的信息。

如果找不到求解程序日志中列出的所有时步,您可以在瞬态求解器,高级 节点的常规 部分将 日志取样( 执行时间) 设置为 0。有时通过将求解器日志 设置为详细,将单个代数求解器迭代信息添加到求解器日志输出中非常有用。仿真过程中时步的变化可以在相应的收敛图 中找到,其中输出所有时步的步长倒数。收敛图中较大的值表示较小的时步。

屏幕截图显示了 COMSOLMultiphysics® 中的收敛图。

如果您观察到求解器的时步非常小,这可能是由几个不同的原因造成的。一个原因可能是你的模型正在接近某种奇点(物理的或非物理的),或者解正趋于无限。另一个原因可能是模型没有给出平滑的时间变化(例如,由于网格太粗糙),这意味着对于任何时步,误差估计都很难实现。第三个原因可能是非线性难以处理(代数求解器不收敛)。为了详细了解时步的变化意味着什么,我们必须更深入地研究时步的确定,接下来,我们来看看 COMSOL 软件使用的一些时间步进方案。

离散时间步进方案

COMSOL 软件中的瞬态求解器 提供了三种不同的时间步进方法:隐式向后差分公式BDF),广义 α 方法,以及显式龙格-库塔方法。

BDF 求解器是一种隐式求解器,它使用具有可变离散化阶数和自动步长选择的向后差分公式。当解的质量允许时使用高阶方案,当需要额外的鲁棒性时使用低阶方案。BDF 方法的稳定性是众所周知的,默认情况下,它们用于涉及扩散、对流和反应的问题。

广义 α 方法 是一种二阶隐式方法,在结构力学问题中很常用,但它也很适合于波传播问题。广义 α 方法 允许我们控制高频阻尼,并且通常比二阶 BDF 方案的阻尼小。在许多情况下,它比 BDF 精确,但也不太稳定。

龙格-库塔 方法是通常用于常微分方程组(ODE)的显式方法。对于使用有限元法(FEM)求解的问题,它们通常效率不高。

在这篇博文中,我们关注的是 BDF 时间步进方案。这 BDF 方案可以在瞬态求解器 中的时间步进 部分选择。根据您的模型的物理特性,它可能已经被选中。

设置时步选择

瞬态研究 步骤,你可以通过指定一个从开始时间到结束时间和中间步骤的明确时间 列表。使用内置算子可以快速指定中间时间点列表。一个常见的误解是,这些中间时间点是求解器采用的指定时间步长,但这些时间点是输出时间,解存储在这些时间点用于后处理和评估。默认情况下,求解器采用的时间步长由算法确定,该算法试图将误差(对于每个时间步长)保持在期望的限度内。以下设置可在瞬态求解器时间步进 部分的求解器采用的步骤中操作实现,以作用于实际的时步选择。

  • 自由: 基于局部误差估计选择自适应时步。基于当前误差估计与容差的比较,减少或增加时步。如果所采取的时步仍然不满足误差估计,那么该步骤用减小的时步重新计算(Tfail 记录在求解器日志中)。由于失败的步骤是无效的,因此这种步长减小的代价很高。如果非线性求解器循环没有在最大迭代次数内收敛( NLfail 记录在求解器日志中),指定的输出时间与求解器采用的时步无关。指定输出时间的解通过求解器所采取的时步之间的插值来计算。
  • 精确:与自由 设置相同,但求解程序会调整其时步,也针对指定的输出时间进行求解。
  • 中级:与自由 设置相同,但求解程序会调整其时步,在由输出时间定义的每个子区间中至少求解一次。
  • 手动:采用用户指定的时步,而不是自动的。时步可以是常数、全局变量表达式,或者由时间值的单调列表之间的间隔确定。因此,该时步完全由用户控制,并且该时步的误差测试被禁用。但请注意,代数求解器的误差估计仍然有效,因此容差仍然是需要考虑的重要因素。如果在最大迭代次数后没有达到代数误差估计,则时步减小。

在下面的内容中,我们将重点关注自由 时间步进。中级精确 时间步进可用于将自适应时步选择的优势与某些重要建模时间或建模时步的手动强制相结合。精确 时间步进还避免了用户指定时间列表的插值,这对某些应用非常重要。但请注意,输出的插值也可以在自由方法 中避免,通过选择要存储的时步:求解器采用的步长

时间离散化

在 COMSOL Multiphysics 中,一个瞬态偏微分方程组(PDEs)通过有限元空间离散化被转化为一个隐式的常微分方程(或微分代数方程;即 DAEs)。(注意,间断伽辽金法并非这种情况。)使用时间离散化(在最简单的情况下,即向后欧拉方案)为未知自由度生成一组代数方程。在每一个时间步中,代数方程都是通过类牛顿方法来求解(全耦合 求解器或含阻尼系数牛顿法分离式 求解器)并使用自动线性化。所得到的线性方程通过直接求解器(例如,MUMPS 或 PARDISO),或者通过迭代求解器求解。

在 COMSOL Multiphysics 中,通过有限元离散化得到的隐式 ODE 系统根据用户提供的相对和绝对容差以预期的精度要求进行求解。有两种不同类型的要求,一种针对时间步进(求解器)误差,另一种针对代数方程(求解器)误差。第一种类型适用于自由中级精确 方法,但不适用于手动 方法。第二个要求都适用。

人们通常会误解,认为当使用手动方法时,不使用容差。时间步进误差要求建立在对所用方法的局部截断误差的估计。代数求解器误差使用非常相似的要求,如在求解稳态问题时,即基于解向量增量的大小。但是该误差估计的归一化适合瞬态求解器使用的归一化。这样做是为了使代数误差范数与时间步进误差范数具有可比性,从而降低代数求解器误差的标量因子(容差系数)应该与时间步进误差相比均匀地抑制代数误差。有时减少这个因子很重要,以避免用代数误差影响计算的解。事实上,如果代数误差不小于时间步进误差,它会导致其他问题,如时间步进不稳定或误差测试失败。

上述两个要求是求解 ODE 系统的核心,下面进一步描述。但是,当这个系统源于有限元离散化时,需要记住的是其他的误差来源不考虑在内。例如,有限元法的截断误差、用数值方法近似有限元积分产生的求积误差以及实际几何的多项式表示产生的几何近似误差。

局部和全局截断误差以及离散化误差

我们来仔细看看截断误差。从有限元离散化,我们得到了隐式微分方程形式

L(\dot{U},U,t) = 0, \ \ U(0) = U^0

其中, 为未知量的矢量或瞬态自由度, 叫做残余矢量。

这里,我们假设只包含一阶时间导数,为了简单起见,我们忽略了约束处理。具有可变步长 BDF 方法通过下式定义

U^k \approx \sum_{i=1}^q \alpha_{k,i} U^{k-i} + \tau_k \beta_k \dot{U}(t_k)

其中,符号 表示解的近似值, 具有步长相关系数

这个表示显示了向后微分公式的 名称。这个公式可以用来消除时间导数,得到一个代数问题

L\left(\frac{U^k-\sum_{i=1}^q \alpha_{k,i} U^{k-i}}{\tau_k \beta_k},U^k,t_k\right) = 0.

在时间 的局部截断误差被定义为 ,其中 是确切满足 的解。通过这个解的泰勒展开,我们得到

L(\dot{U}(t_k;U^{k-1})+O(e_k/\tau_k) + O(\tau_{k}^q), U(t_k;U^{k-1})+e_k,t_k)=0,

如果也对残差进行泰勒展开,我们得到

L(\dot{U}(t_k;U^{k-1}), U(t_k;U^{k-1}),t_k)+\frac{\partial L}{\partial \dot{U}}(O(e_k/\tau_k) + O(\tau_{k}^q)) + \frac{\partial L}{\partial U}e_k + {\rm h. o. t.}= 0,

其中每个定义的第一项都是相同的零。

在质量矩阵 可逆的情况下,对于 阶方案,有

|e_k| = O( \tau_k^{q+1} )

对于不可逆的质量矩阵,我们有一个 DAE,误差分析更详细,但自适应时间步进的原理是相同的。这里,我们还假设不同的时间步长相互之间有些关联,因此时间步长不会随步长的不同而任意改变。全局截断误差 才是最重要的。这个误差从所有局部误差中获得贡献,从概念上来说,就是将所有的局部误差加起来。对于 阶瞬态方法,并且具有恒定的时步 ,我们发现(通过适当的规范化) 在适当的假设下,

|E^{k}| \le C \tau^q

这里,常数 与问题密切相关。一个实际的常微分方程问题的局部误差既可以被方程的性质放大,也可以被方程的性质抑制,因此对局部误差简单求和的概念应该持保留态度。例如,对于误差被放大的情况,常数可能会非常大。此外,在仿真过程中,以恒定时间步长获得的局部误差可能有很大差异。这些观察结果表明,选择时间步长的一个好策略是在时间步进期间将局部误差保持在同一水平。还应该可以调整局部误差的水平,以便可以控制全局误差,并且在必要时可以减小全局误差。

对于给定的离散格式,误差估计的显式表达式可以按照下式给出

e_{k} = C_k \tau^{q+1} U^{(q+1)}(t_k) + O(\tau^{q+2})

其中, 是关于 和过去的步长 的可计算函数。

例如,BDF 的显示模拟可以用来计算预测值

U^{k(0)} = \sum_{i=1}^q \alpha_{k,i}^{\rm pred} U^{k-i} + \tau_k \beta_k^{\rm pred} \dot{U}(t_{k-1}).

渐进分析给出

U^k – U^{k(0)} = \bar{C}_k \tau ^{q+1} U^{(q+1)}(t_k) + O(\tau^{q+2})

其中,常数 是可计算的。

因此,我们得到了一个可计算的表达式,作为局部截断误差的上界

|e_{k}| \approx |\bar{e}_k| := \frac{C_k}{\bar{C}_k} |U^k-U^{k(0)}|.

这个可计算的表达式在 COMSOL Multiphysics 中用作局部截断误差的近似值,该近似值又可用于控制或调整时间步长。

BDF 时间步进方案的时间步进控制

对于绝对容差 ,和相对容差 ,如果 ,那么 BDF 时间步进方案中的时间步长可以被接受。在自由度为 阶情况下,如果误差估计的加权均方根范数

\|\bar{e}_{k}\|^2_{\rm WRMS} := \frac{1}{M} \sum_j \frac{1}{N_j} \sum_i \frac{ |\bar{e}_{k,i}(q)|^2}{(A_i + R |U^{k}_i|)^2} < 1

小于 ,则时间步长可以被接受。这里, 是在时间 时刻、缩放或未缩放的绝对容差 下,缩放或未缩放的场分量 的局部截断误差的估计值。你可以参阅 COMSOL Multiphysics Reference Manual 中的“隐式瞬态求解器算法”章节查看有关缩放和未缩放版本的详细信息。

我们发现每个时步的误差取决于两个因素:

  1. 时步的大小,
  2. 离散化的阶数

由于高阶离散需要进行更多的工作,因此高阶格式以更高的计算成本给出更高的求解精度。时步越短,精度越高,成本也越高,因为总的来说需要计算更多的时步。自适应的 BDF 时间步进方法在保证所需求解精度的前提下,同时调整阶数和时步,尽量最小化成本。它对时步和阶数进行了复杂的预测,但仍然有可能当前时步的结果不符合误差限制。在这种情况下,时步将以较小的时步重复 ,并且步进故障 Tfail 被记录下来。

控制代数误差的影响

请注意,对于非线性问题,需要在每个时间步长中求解一组非线性方程。这通常是通过类似牛顿迭代的方法来完成的,这种方法会产生额外的代数误差。此外,牛顿法中的线性化方程可以用线性迭代求解器来求解,而这些求解器只能在一定程度上近似线性化系统的精确解。

对于给定预定义的迭代次数,非线性求解器可能无法收敛。在这种情况下,如果需要的话,可以更新雅可比矩阵并且减小时间步长。在日志中,你会发现计数器 NLfail 增加了。通过检查时步 k 的第 m 次迭代的增量 来估计代数求解器误差,其中, 阶牛顿迭代的近似值,(例如,参见日晷:非线性和微分/代数方程解算器套件)。

代数误差 可能会影响截断误差和稳定性。你需要确保代数误差足够小。容差因子 (在全耦合分离 求解器中的终止技术 部分设置)是一个安全系数,与截断误差相比,它可用于抑制代数误差。用于截断误差的加权范数也可同样用于代数误差减少容差因子 通常会导致非线性求解器中迭代次数增加(或相同)。

对于单个时步,用较小的容差因子求解方程的计算成本更高。但是,请注意,使用过大的容差因子 可能导致代数误差,干扰时间步进方法并导致不正确的时步选择、不准确的方法或不稳定的方法。最后两种影响也可能是手动的 时间步进法导致的。

时间步长选择和阶数选择

接下来,我们将描述 BDF 方案中时间步长的选择方法。对于瞬态求解器,绝对容差和相对容差控制每个积分步骤中的误差。相对公差 通常由物理场设置决定,但我们可以在瞬态研究 步骤中转换为手动控制。默认值 。绝对容差 可以在瞬态求解器的绝对容差 部分设置。对于公差方法 中的因子选项,绝对容差是相对容差乘以指定系数。手动的 选项允许我们在默认值为 的情况下指定一个详细的值。通过使用变量列表,可以将绝对容差单独用于每个变量。

求解器设置的屏幕截图。

具体来说,BDF 计算 th 时步的局部截断误差的估计值,并且要求误差估计来满足不等式 。在时间步进方案中,有一个初始阶段是经过特殊处理的。对于开始的几步,在每一步中步长 被加倍,阶数被提高, 直到局部误差测试 失败;通过检查解的平滑性的机制来降低阶数 ;或者阶数 达到最大数量级,。对于 附近的 BDF 方案中阶数的选择是基于比例导数范数 单调递减的要求。这些范数再次使用以下事实进行评估

\tau^{q+1} U^{(q+1)} \approx T(q) := (q+1) \bar{e}_k.

步长和阶数的选择从 的单调性测试开始。 递减,表示解是光滑的,阶数可以增加。当 随着 增加是,阶数需要减小。否则,保持阶数 。接下来,执行局部误差测试,如果失败,则按阶数 和新的步长 重新执行该步骤。后者基于 的渐近行为。对于 ,我们要求对于校正的时步 ,至少 是成立的,这就产生了新的时步 。通过

\frac{A+R|U|}{\bar{e}_{k,\tau}}= \frac{\bar{e}_{k,\tau’}}{\bar{e}_{k,\tau}} = \left(\frac{\tau’}{\tau} \right)^{q+1} < 1

我们衍生出

\tau’ =\left(\frac{A+R|U|}{\bar{e}_{k,\tau}}\right) ^{1/(q+1)} \tau

其中,在实施中使用了额外的安全系数。

如果误差小于允许值,则存在一个所谓的“死区”,在该区域中,时步不增加,直到误差小于允许值的 16 倍。然后,时间步长增加两倍。请注意,时步的确定主要由限制器调节。调节器仅在线性斜率范围内基于给定的公式调节。当估计的局部误差大于它们应有的值,并且需要减少时步时,该机制就起主导作用。在下图中(类似于参考文献1中的相应图),可以确定斜率 在线性斜率范围内,其中 被印在

时间相关问题的线性斜率范围图。

如果通过局部误差测试,则调整下一步的步长和阶数。如果在上一步中进行了更改,则阶数不会改变。在阶数 和恒定步长时,如果最后的 步骤是按固定阶数进行的,BDF 考虑提高或降低阶数。如果 随着 而减少,阶数 增加。如果
随着 增加,阶数 减少。更多细节和启发可以在下列文档中找到:IDA solver in the Suite of Nonlinear and Differential/Algebraic Equation Solvers (SUNDIALS)

关于自动时间步长和阶数选择的总结性思考

在这篇博文中,我们讨论了 BDF 时间步进方法中自动时间步长和阶数选择的原则。这些原则根据规定的容差,以较低的计算成本和最大的鲁棒性保证求解精度。在实践中,我们发现这种原则可以导致非常小的时间步骤和很长的模拟时间。时步过小以及依赖时间和非线性求解器步骤的重复失败表明可能需要进一步调整模型配置和求解器设置。我们还应该始终确保底层模型有一个合理的解。

在接下来的博客文章中,我们将介绍一些示例,并讨论在时步过小的情况下可以调整哪些求解器设置。敬请关注!

延伸阅读

通过浏览 COMSOL 知识库获得更多关于瞬态模型的详细信息:

参考文献

  1. G. Söderlind, L. Wang, “Adaptive time-stepping and computational stability“, J. Comp. and Appl. Math., vol. 185, pp. 225–243, 2006.
]]>
//www.denkrieger.com/blogs/automatic-time-step-and-order-selection-in-time-dependent-problems/feed/ 0
机械系统的频率响应分析 //www.denkrieger.com/blogs/frequency-response-of-mechanical-systems //www.denkrieger.com/blogs/frequency-response-of-mechanical-systems#comments Wed, 05 Jun 2019 07:05:04 +0000 http://cn.staging.comsol.com/blogs?p=204811 本文是关于结构动力学阻尼的博客文章的续篇,这里我们将详细讨论带阻尼的机械系统的谐波响应,在 COMSOL Multiphysics® 软件中演示设置频率响应分析的不同方法,以及如何解释结果。

什么是频率响应?

一般而言,系统的频率响应显示系统的某些属性对以频率形式输入的激励产生响应的函数。COMSOL Multiphysics中的频率响应,通常是指对谐波激励的线性(或线性化)响应。为了生成频率响应曲线,需要进行频率扫描; 也就是对很多不同频率进行求解。通常,频率响应曲线将表现出许多与系统固有频率对应的不同峰值。
显示典型频率响应曲线的图表。
典型的频率响应曲线。绘制范围内有两个固有频率,分别为13 Hz和31 Hz。

重新审视单自由度系统

在之前的博客文章中,我们讨论了具有黏性阻尼的单自由度系统动力学的各个方面。其中阻尼的固有频率为

该频率是指在没有其他外部激励的情况下,将系统从变形状态释放之后,产生振动(具有衰减幅度)的频率。此时,一个有趣的问题出现了:“哪个激励频率会给出最大幅度的响应?”一般会认为恰好是阻尼的固有频率,但如下图所示,情况并非如此。

单自由度系统的图形。
单自由度系统。

由于系统是谐波运动,因此采用复数表示法。分解出常见的谐波乘数 ,可得运动方程为

载荷f的相位角可以作为参考,因此f是实值。除以刚度k可以得到归一化形式:

等式的右边是静态位移。因此,动态解和静态解之比是

H 函数通常称作传递函数。其中 β 表示激励频率与无阻尼固有频率的比值。传递函数的大小为。

在此,β 用来表示激励频率与无阻尼固有频率之间的比率。 传递函数的大小为

下图显示了此功能。

显示频率中传递函数幅度的图表机械系统的响应。

使用标准微积分,可以通过找到(平方)分母的最小值来确定给出最大振幅的频率

因此,给出最大响应的激励频率为

最大响应的激励频率低于阻尼固有频率, 实际上,频移接近两倍。

最大响应的激励频率与自由频率不同,这似乎是矛盾的,但可以解释为由阻尼引起的力与位移之间的相移所导致。在无阻尼的情况下,载荷和位移在低于固有频率时完全同相,高于固有频率时翻转到180°异相。而有了阻尼之后,相移是平滑过渡,如下图所示。无论阻尼水平如何,无阻尼固有频率的相移始终为 90°。

显示位移相移的图表频率的函数。
位移的相移作为频率的函数关系。

当存在阻尼时,由于力可能向系统提供能量,因此造成力和位移产生相移。

损耗因子的阻尼

对具有阻尼损耗因子的单自由度系统进行分析,此时系统的运动方程为

阻尼的固有频率为

令人惊讶的是,增加阻尼并不会使固有频率减小,而是增加。这是因为这种形式的损耗因子阻尼实际上会增加刚度。复数刚度的绝对值是

由于这种损耗因子阻尼,传递函数为

其大小为

可以看出,当β= 1时(即,无阻尼固有频率),振幅最大。同样,最大响应频率低于有阻尼时的固有频率。

前一篇博客文章中提到,损耗因子阻尼的另一种定义具有如下属性:复数刚度的绝对值与阻尼水平无关具有以下属性:复杂刚度的绝对值与阻尼水平无关。这可以使用对复数刚度进行归一化的定义方法来获得如下复平面的纯旋转。

由上述公式可知,固有频率随着阻尼而减小:


本文不做详细分析,结论是相应的激励频率下降,将给出最大振幅,因此仍低于有阻尼的固有频率。

当考虑损耗因子阻尼时,激励和响应之间的相移非常有趣:即使在非常低的激励频率下,相移仍然存在,且其渐近于arctan(η)。
显示使用时位移的相移的图表损耗因子阻尼。
当使用损耗因子阻尼时,位移的相移与频率的函数关系。低频渐近线用虚线表示。

考虑摩擦因素

当两个表面之间的摩擦提供阻尼机制时,由于系统的非线性,对谐波输入的响应不再是谐波,可能仍然会存在周期性,但并不是谐波响应。频域法无法解决这些问题,因为其假设是输入输出为线性关系。

在 COMSOL Multiphysics® 中进行频率响应建模

建立研究

在模型向导中添加结构力学物理接口后,您将看到许多研究类型,其中四种可用于计算频率响应:

  1. 频域
  2. 频域,预应力
  3. 频域,模态
  4. 频域,预应力,模态

显示可用研究类型的屏幕截图 COMSOL Multiphysics® 中的固体力学界面。
Solid Mechanics 界面的可用学习类型。

其中两项研究使用直接求解方法,两种研究使用模式叠加方法。在预应力分析类型中,考虑了静止预载荷的刚度变化。模态叠加非常适合频域分析,因为它它能根据给定的频率选择合适的本征模。

在任何一种情况下,您都可以通过在研究设置中提供计算响应的频率列表来执行频率扫描。通常,您希望将频率聚集在结构的固有频率附近。
显示如何输入频率扫描频率的屏幕截图。
输入频率可进行频率扫描。

需要注意的是,如果阻尼为零,则在固有频率下的响应趋于无穷大。这意味着不可能在固有频率处或接近固有频率时解决无阻尼频率响应问题。数值公式将给出奇异或至少是病态的系统矩阵。

是否存在扰动?

对于频域研究,求解器序列中的稳态节点中有一个非常重要的设置,即线性
如何选择模型中的线性属性的屏幕截图设置。
选择“线性 ” 属性。

理论上,任何频域分析都可以被认为是一个小扰动,因此使用线性扰动绝不是错误的。绝不会出错。然而,最常见的情况是振动以零为中心。在这种情况下,它并不真正关心问题是线性线性扰动。但是,该设置从根本上改变了载荷方式。载荷可以标记为谐波扰动。如果将线性度设置为线性扰动,则仅考虑此类负载。 在研究中忽略所有未标记为谐波扰动的载荷。相反,如果是线性而不是线性扰动,则忽略标记为谐波扰动的所有载荷,并将其他载荷视为谐波。


边缘载荷,指定为谐波扰动

该设置的目的是能够区分导致可能的预应力状态的负载和作用于其上的谐波激励。

添加标准频域研究时,默认情况下,研究不会设置为扰动。因此,在这种情况下,谐波扰动标签不应用于载荷,除非您更改线性度设置。当您添加频域预应力研究时,频率响应研究步骤设置为扰动分析。如果研究是模式叠加类型,则研究始终是线性扰动。

解释结果

频域分析的结果是复值,其中隐含了谐波变化。复数的相位角描述了与参考相位之间的相移(可以任意选择,但通常作为主载荷的相位)。它还提供有关结构中不同点之间相移的信息。需要注意的是,由于单个有限元内的位移分量可以具有不同的相位角,因此应力张量的分量也很可能彼此不同相。这在疲劳分析中会比较重要。
在许多情况下,如在彩色图中,只能显示实数。所有展示的结果约定如下:如果期望查看一个复值变量 v 的实数值时,则使用实数部分。

其中,数据集的属性(如相角Φ)是可以修改的。
显示数据集中相角如何调整的屏幕截图。
调整数据集中的相角。

在大多数频率响应分析中,通常关注的是结果的振幅 v 与频率的函数关系。因此应该研究 abs(v) 而不是 v 本身。两者之间的差异如下图所示。
机械响应系统。
频率响应图的示例。注意,“u”的图形与“real(u)”相同。

为了更详细地了解发生的情况,我们可以将结果的虚部和辐角添加到图中:
包含相移的频率响应图。
包括相移的频率响应。

在低频时,实部接近绝对值。在固有频率附近,则主要是虚部。这意味着响应与激励几乎不同相。考虑一下,如果将数据集里面的相角改为 45°,频率响应会怎样变化。

显示相位角时的频率响应的图表是45°。
当数据集中的相位角为 45° 时的频率响应。

由上图可知,正如预期,振幅不会改变。但实部和虚部的各个值均会改变,其中相角曲线向上移动 π/4。实际上,如果向载荷添加45°相位角,我们将获得完全相同的结果图。
在 COMSOL 中向相关角添加相位角的屏幕截图 Multiphysics®。
向载荷添加相位角。

在模型中,除了上述相角输入,您还可以使用复数表示法直接输入载荷:
显示负载的复杂表示的屏幕截图在模型构建器设置中。
与上述相同载荷的复数表示法。

当所有载荷并非彼此同相时,能够规定相角非常重要。例如,可以通过使 y 方向上的载荷相对于 x 方向上的载荷具有 90° 相移,来方便地描述一个旋转的非平衡受力物体。

扰动研究的结果

如果研究是扰动类型,则会有两组结果:预应力解和扰动解。在这种情况下,可以在各种结果表示功能中访问额外的选择::待求表达式
扰动评估类型选择的屏幕截图分析。
选择扰动分析的计算类型

在这里,您可以选择研究扰动解,预应力解或其组合。对于扰动解,您还可以获得一个选项:计算微分复选框。
选择计算差异的屏幕截图。
选择计算微分

此设置会影响非线性表达式的处理方式。如果未选择计算微分,则会在面值处获取非线性数量。例如,u^2 将会很方便地从扰动解中获取变量u的平方。由于 u 通常是复值的,因此通常该操作是无意义的。

当选择计算微分时,则该非线性量将预应力状态附近线性化。表达式 u^2 将计算 2*u0*u,其中 u0 是线性化点处的值。

将频率响应结果转换为时域

在某些情况下,您可能希望在时域中进行频域分析的谐波响应可视化,尤其希望有多个激励频率。
对两个激励的响应图具有两种不同频率的负载。
受到两个不同频率载荷激励的响应。

您可以使用频域到时域 FFT研究步骤将频率响应结果转换到时域。
用于转换结果的研究序列的屏幕截图频域到时域。
从频域到时域的转换结果研究序列。

此技术用于以下教程模型:

结束语

频域分析是分析受谐波激励的线性系统的有力工具。实际上,通过对负载进行初始傅里叶变换,可以使用频率响应分析来研究任何类型的周期性激励。

COMSOL 案例库中还有更多机械频率响应分析示例,例如:

]]>
//www.denkrieger.com/blogs/frequency-response-of-mechanical-systems/feed/ 2
数值积分和高斯点简介 //www.denkrieger.com/blogs/introduction-to-numerical-integration-and-gauss-points //www.denkrieger.com/blogs/introduction-to-numerical-integration-and-gauss-points#comments Wed, 01 May 2019 03:07:24 +0000 http://cn.staging.comsol.com/blogs?p=200531 在有限元模型中,你可能会在多种情境下遇到数值积分和高斯点的概念。在本篇博客文章中,我们将讨论在什么情况下,以及为什么使用数值积分。此外,还强调了在 COMSOL Multiphysics® 软件中检查和修改数值积分方案的方法。最后,对高斯点自由度的使用进行了说明。

目录

  1. 什么是数值积分?
  2. 弱贡献的积分
  3. 修改积分阶次
  4. 内置的减缩积分
  5. 积分耦合算子
  6. 后处理过程中的积分
  7. 高斯点形函数
  8. gpeval 算子

什么是数值积分?

在计算一般域上非平凡函数的积分时,我们必须采用数值方法。数值积分也称为数值求积,其本质是用求和代替积分,其中被积函数在多个离散点被采样,可以描述为

\displaystyle \int_{\Omega} f(\mathbf x) dV \approx \sum_i f(\mathbf x_i)w_i

其中 x是积分点的位置,w是相应的权重因子。积分点通常称为高斯点,但是严格来说,这种命名法仅适用于高斯求积 法定义的积分点。在 COMSOL Multiphysics 中,真正的高斯求积用于一维,二维中的四边形单元,三维中的六面体单元等积分。其他情况下,需要使用其他类似的方案。

高斯求积

在高斯求积算法中,需要选择积分点的位置及其权重,以便精确地对阶次尽可能高的多项式进行积分。由于 N 次多项式包含 N + 1 个系数,而具有 M 个点的高斯点规则包含 2M 个参数(位置+权重),因此可以精确积分的多项式的最高阶次是 N = 2M-1。

高斯求积对于可由一定程度的多项式很好地进行近似的积分场非常有效。一维中一阶高斯求积的积分点和权重如下表所示。积分取自归一化区间 [-1,1]。

阶次(M) 精度(N) 位置(xi 权重(wi
1 1 0 2
2 3 ±0.577 1
3 5 0, ±0.775 0.889 (= 8/9), 0.556 (= 5/9)
4 7 ±0.340, ±0.861 0.652, 0.348
5 9 0, ±0.538, ±0.906 0.569, 0.479, 0.237

在 COMSOL Multiphysics 中,积分阶次由可以精确积分的多项式的阶次指定,仅使用偶数。对于真正的高斯点积分,如上所示,精度始终是奇数次幂。软件指定为“4”的积分阶次实际上在这些单元形函数上使用精度为 5 阶的高斯求积。

高斯求积示例

作为高斯求积的一个示例,设想一个函数

\displaystyle f(x,y) = 0.74894\, e^{0.5xy} \cos \left( \dfrac{3 \pi x y}
{2}
\right )

在 -1≤x≤1,-1≤y≤1 的正方形上,积分为 1。如下图所示,该函数在域上的分布相当复杂。


要积分的函数。

下表显示了不同高斯求积阶次的结果。只要函数可以用一定阶次的多项式合理地近似,积分的值就会快速收敛。

积分点 精度 积分阶次 注释
1 1 0(或 1) 2.9958 仅使用质心处的值明显高估了积分
2×2 3 2(或 3) 0 在 2×2 规则中,高斯点位于 ,余弦函数为 0(运气太差了!)
3×3 5 4(或 5) 1.1519
4×4 7 6(或 7) 0.9887
5×5 9 8(或 9) 1.0005
6×6 11 10(或 11) 1.0000
7×7 13 12(或 13) 1.0000
8×8 15 14(或 15) 1.0000

然而,多项式的最优行为高斯求积有一个缺点:不能很好地对非常不连续函数进行积分。假设我们要对如下函数进行积分:在上述相同正方形上,y < -2x – 1 时,函数值为 f(x,y) = 1,其他情况下,f(x,y) = 0。由于函数在正方形四分之一区域上的值为 1,并且正方形面积为 4,我们可以立即看出精确积分应该为 1。结果如下表所示。

积分点 注释
1 0 只有(0,0)一个点上函数的计算结果为 0
2×2 1 四分之一点的计算结果为 1,权重为 1
3×3 0.8025 两个点的计算结果为 1,权重分别为 
4×4 1.2269 五个点的计算结果为 1
5×5 1.0325
6×6 1.0918
7×7 0.9892
8×8 0.9961

显示涉及数值积分和高斯点的问题的图形。
4×4 积分点的情况。橙色表面是函数值为 1 的区域,绿色高斯点是对积分值有贡献的点。

从表中可以看出,计算这种不连续函数的精确积分是非常重要的。纯属偶然,2×2 积分方案给出了精确的答案,但收敛完全不单调。

为什么这很重要?在有限元分析中,你可能会遇到呈现明显局部梯度的场,例如相变问题或固体力学中塑性开始时的问题。在包含这种突变的单元上计算的积分可能具有显著的离散化误差。此外,解的收敛性也会减弱。当单个高斯点改变其状态时,解的微小变化可以显著改变计算残差。

在这种情况下,选择一个比用于将场离散化的形函数默认值更低的多项式阶次可能更好。较低的分辨率可以通过使用更密集的网格来补偿,其结果是不可避免的突变将被局限在具有较少积分点的较小单元。

此外,如果你在后处理过程中计算不连续函数的积分,要记住,数值积分收敛可能很缓慢。

弱贡献的积分

在每个有限元内,有各种表达式需要进行积分,以便形成刚度矩阵、质量矩阵、载荷矢量和残差等。以固体力学为例,标准弱(或变分)公式对应于虚功原理:内应力作用于虚应变变化所做的虚功等于外力作用于相应的虚位移变化所做的虚功。

\displaystyle \int\limits_{\quad\Omega} \sigma : \tilde {\varepsilon} \; dV = \int\limits_{ \quad\Omega} \mathbf f \cdot \tilde {\mathbf u} \; dV + \int\limits_{ \quad\Gamma} \mathbf t \cdot \tilde {\mathbf u} \; dS

这里,波浪号(〜)表示虚变化。在 COMSOL Multiphysics 的表达式中,它由 test() 运算符表示,其中包含体积力 和边界牵引力 t,也可能还包含其他类型的贡献。左侧将贡献于刚度矩阵,而右侧将贡献于载荷矢量(假设力与位移无关)。

为了检查 COMSOL Multiphysics 中有限元实现的公式,你需要启用方程视图

方程视图特征设置为启用的屏幕截图。
打开 方程视图

如果我们在固体力学 接口中查看材料模型(比如线弹性材料)下的方程视图,会看到一个名为弱表达式 的栏,你可以从中看到用于形成各种矩阵的表达式,例如,刚度矩阵。

带有弱表达式的方程视图设置的屏幕截图。
检查稳态情况下 固体力学接口中 线弹性材料的弱表达式。

在上图中,你可以看到积分阶次的文本框,本例中,值为 4。COMSOL Multiphysics 中描述积分阶次的数字是可以精确积分的多项式的最高阶次,默认的积分阶次基于用于描述场(本例中为位移)的形函数的阶次。这里使用了默认的形函数阶次——二次,因此应力和应变在单元上基本上呈线性变化。所以,应力和应变变化的乘积是二次的,这表明 4 阶可能超过必要程度。为什么选择这个值将在下文讨论。

第二个例子,我们来看固体力学 中的边界载荷

边界载荷特征弱表达式的屏幕截图。
边界载荷的弱表达式

这里,积分阶次也是 4。由于位移形函数是二次多项式,这意味着应该可以精确地积分牵引力不超过二次变化的载荷贡献,因此牵引力与位移变化的乘积是 4 阶。

关于弱表达式的一些微妙之处

只有当单元具有理想形状(例如,没有弯曲边界)时,上述讨论内容才完全正确。如果你深入研究这个理论,积分实际上也会包含局部比例因子(雅可比),它来自实际单元几何结构与名义单元几何结构之间的转换。例如,如果在二维四边形单元上进行积分,则在理想正方形 -1≤ξ≤1,-1≤η≤1 上进行数值计算,

\displaystyle \int_{\Omega_e} f(x,y)\;dA = \int_{-1}^{1} \int_{-1}^{1} f(\xi, \eta) \left | \dfrac{\partial \mathbf x}

{\partial \boldsymbol \xi}
\right | \; d\xi d\eta

雅可比通常是一个有理函数(分子和分母都是多项式),所以这种数值求积法甚至可能无法对它进行精确积分。因此,明智的做法是在选定的积分阶次中留出一些余量。顺便提一下,雅可比效应是严重失真的单元比具有理想形状的单元表现更差的原因之一。这篇关于在 COMSOL Multiphysics 中检查网格的博客文章包含了更多关于网格质量的信息。

即使单元形函数被称为“二次函数”,它也可能(在某些情况下)包含更高阶的项。用户界面中指示的形函数阶次显示了形函数中最高阶的完整多项式。因此,使用比看起来更精确的积分规则的另一个原因是,多项式中可能存在一些高阶项。

对于某个贡献,你可能会在方程视图 中看到比预期更高的积分阶次的另一个原因是,可能需要确保刚度矩阵中的对称性。

修改积分阶次

你可以通过编辑文本框来更改方程视图 中任何弱表达式的积分阶次,这样做有两个主要原因。

第一个也是比较明显的一个原因:提高精度。假设载荷(一般来说可以是力、热通量、电流等)与单元大小相比变化很快,那么增加数值积分的阶次将会提高进入域的总力或通量的精度。但是,靠近应用边界条件的位置的局部解仍然可能不是很理想,原因是,它永远不会比单元的形函数所代表的更好。

然而,还有另一个有趣的情况:降阶积分。这意味着由于某种原因,积分阶次低于正式需要的阶次,其中一个原因是加快计算速度。在求解有限元问题时,大部分 CPU 时间花费在两个任务上:形成单元矩阵(装配)和求解大型线性方程组。求解方程所花费的时间比模型大小增加得更快,通常大约是单元数量的平方。在装配上花费的时间与模型大小成正比(实际上,与单元数和每个单元积分点数的乘积成正比)。对于非常大的模型,方程求解总是占主导地位,但对于在每个积分点有大量计算的中型非线性模型,可能值得考虑使用降阶积分。

降阶积分也是一种数值装置,有时用于消除人工刚度,这种人工刚度可能出现在某些单元公式中,这种现象通常称为锁定。在二维轴对称的壳 接口中可以找到为此目的使用降阶积分的例子。在虚功方程中,一些项采用阶次 2 进行积分,另一些项采用阶次 4 进行积分。如果在任何位置都使用完全积分,当壳厚度变小时,单元实际上会变得太硬。通过使用降阶积分,可以有意地丢弃应变能中一些有问题的项。

显示弱表达式设置中虚功贡献的屏幕截图。
轴对称 壳接口的虚功贡献

编者注:以下部分是于2023年5月4日新增的内容,包括关于 COMSOL Multiphysics 6.0 版本新功能的信息。

内置的减缩积分

一些结构力学的接口包括可以直接从材料模型的设置中选择减缩积分选项。

截图显示了正交设置部分展开的特写。在这个部分,缩减积分选项被选中,沙漏稳定性被设置为自动。

线弹性材料设置窗口的正交设置部分。

与在方程视图中编辑积分阶次相比,这种方法有几个优点:

  • 改变可以在一个地方进行,并自动传递到任何可能的子节点。
  • 你不必担心什么是适当的减缩积分方案。
  • 对于某些单元形函数,如果降低积分阶次,刚度矩阵将变得奇异,可以通过内置的沙漏稳定性功能进行调整。
  • 有些材料模型(如塑性),在积分点存储了局部状态,这是自动与积分规则同步的。

积分耦合算子

在“模型开发器”的定义 下,你可以创建积分算子,用来定义作为问题公式一部分的全局变量,但它们也可以在结果评估期间显式地用在表达式中。

显示如何在 COMSOL® 中添加积分算子的屏幕截图。
添加积分算子。

添加积分算子时,需要进行三个主要选择:

  1. 应采用积分的域、边界或边。
  2. 积分阶次——这也为你提供了一个以精度换取速度的选项。请注意,实际的被积函数不仅是你提供的表达式,还要乘以从理想单元形状到真实单元形状转换的雅可比。
  3. 框架——此项只有当存在不同框架(如动网格、变形几何和结构力学中的几何非线性)时才重要。简而言之就是:积分应该取变形的还是未变形的几何结构?

积分算子“设置”窗口的屏幕截图。
积分算子的设置。

后处理过程中的积分

如果要在后处理期间计算积分,可以使用两个选项:使用积分算子(如上所述)或在派生值 下添加积分 节点。在很大程度上,选择随意。但是,在积分 节点中,你无法明确选择积分框架;它是根据数据集 节点中的框架选择推断出来的。

显示如何在后处理过程中添加积分节点的屏幕截图。
在结果评估期间添加积分节点。

框架选择数据集的“设置”窗口的屏幕截图。
数据集的设置,从中可以选择结果解释的框架。

如果框架选择很重要,你可能应该使用积分算子将出现细微错误的风险降至最低。如果在求解完成后添加积分算子,则必须先运行更新解,然后才能使用新算子。

屏幕截图显示了在 COMSOL® 中更新模型解的选项。
更新解。

请记住选择足够高的积分阶次。特别是,如果要积分的表达式是强非线性或不连续的,更加要注意。不连续表达式的一个常见特例是布尔表达式。例如,如果在传热分析后,你想计算温度高于某个值的体积,你可以使用像 T>1066[K] 这样的被积函数,该表达式在满足条件的情况下计算结果为 1,在其他情况下计算结果为 0,因此对它进行积分将给出满足条件时的体积。但是,这两个值之间的边界通常会穿过单元。

对布尔表达式进行积分的设置的屏幕截图。
积分精度提高后的布尔表达式积分。

高斯点形函数

如果要对多物理场模型进行扩展,有时需要添加用户定义的自由度(因变量)。执行这个操作时,你必须选择用于表示它们的形函数的类型,其中一个选项是高斯点数据。所有其他选项给出不同类型的场,这些场在单元上为连续分布,在相邻单元之间可以是连续的,也可以是不连续的。“形函数”的高斯点数据 类型完全不同,它仅在每个高斯点存储一个值,但与单元中其他位置的值没有关联。

显示用于选择因变量形函数的菜单的屏幕截图。
为用户定义的因变量选择形函数类型。

当你想要存储局部状态时,高斯点数据 类型很有用。比如,在需要“记忆”的历史相关的非线性本构模型中就有这种情况。本构模型主要是在计算刚度矩阵和残差时访问的,因此在求解过程中,单元中唯一实际评估本构模型的位置是积分点。所以,将这种类型的数据准确存储在那里是有意义的。

内部使用高斯点数据的一个例子是在材料模型中存储非弹性应变,例如结构力学中的塑性和蠕变。

决定存储高斯点数据后,就需要选择单元阶次。在高斯点数据情况下,这与上面讨论的积分阶次相同。存储高斯点数据的成本(在内存和 CPU 时间方面)与一维中的选定阶次、二维中的平方和三维中的三次方成正比。

用于选择单元阶次的菜单屏幕截图。
选择积分点模式。

如果要添加高斯点变量以与内置物理场接口一起使用,通常应选择与用于计算相关弱表达式的积分阶次相同的积分阶次。如果不匹配,则必须在单元中的不同位置之间传输值,这种情况下精度和性能会降低。

gpeval 算子

如果变量存储在高斯点中,无论是内置还是由你定义,都有可能需要在单元上插入这些变量。这在后处理过程中尤为重要。默认情况下,当在单元中的另一个位置求值时,高斯点变量的值只是从最近的高斯点选取的。gpeval() 算子可用于将离散高斯点数据映射到连续场。在其最简单的形式中,算子以 gpeval(gporder, expression) 形式被引用,例如, gpeval(4,solid.epe)。有关更多详细信息,请参阅 COMSOL Multiphysics User’s Guide

为了进行说明,请设想以下示例:x 坐标(范围从 0 到 3)作为高斯点数据存储在小型三单元模型中。这是通过添加辅助因变量来实现的,如下所示。

辅助因变量设置的屏幕截图。
高斯点数据弱贡献的屏幕截图。

 x 坐标作为高斯点数据存储。

弱贡献 (myX-nojac(X))*test(myX) 只表示:“将变量 myX 设置为当前值 X。”添加算子 nojac() 是为了防止 myX 和  X 之间出现双向耦合。当你只想为因变量赋值时,使用它是一个很好的做法。

如果高斯点变量 myX 随后被绘制为曲面图(没有单元之间的平均值),结果将是不连续的。在每个单元中,高斯点变量被移动到最近的角,然后插值到单元上。相反,如果绘制表达式 gpeval(2,myX),我们将检索精确的 坐标分布。

显示绘制和提取的高斯点变量的图像。
高斯点变量(底部)和外推高斯点变量(顶部)图。箭头指示在结果评估期间高斯点数据默认是如何移动到拐角的。

后续操作

单击下面的按钮,了解有关 COMSOL® 软件中可用功能的更多信息:

]]>
//www.denkrieger.com/blogs/introduction-to-numerical-integration-and-gauss-points/feed/ 1