你知道吗?你可以在 COMSOL 中使用 研究 节点执行一系列程序化操作,包括求解模型、将模型保存到文件,以及生成和导出绘图组、结果和图像。这篇博客,我们将详细介绍这一实用功能。
编者注:本文最初发布于 2017 年 6 月 21 日。内容和图片现在已经更新。
为了演示此功能,我们将从案例库中加载微混合器教程模型。该模型位于 COMSOL Multiphysics > 流体动力学 文件夹中,演示了层流静态混合器中的流体流动和质量传输。
该模型首先使用 层流 接口模拟流体流动。然后,将流体流动模拟的结果作为输入,通过 稀物质传递 接口计算混合效率。物质将基于流体速度被输送到下游。
该模型的计算时间为几分钟。为了简化模型以更快地运行计算,我们将不求解物质传递。为此,我们将修改第二个研究步骤 (步骤 2:稳态 2)的设置,清除 设置 窗口中的 稀物质传递 和 反应流,稀物质 复选框。
为了加快模型运行速度,我们还可以做一个额外的更改。在 网格 节点设置中,将 序列类型 设置为 物理场控制的网格,将 单元大小 设置为 极粗。
现在,我们可以计算 研究 1,以确保一切正常。结果图显示了沿混合器几何形状的几个切面的速度大小。
准备好模型后,我们就可以使用作业序列来自动完成模型求解和保存的过程。
要在 研究 节点下定义操作序列,首先要单击模型开发器工具栏上的相应按钮(眼睛图标),打开 显示更多选项 对话框。然后,选择 求解器和作业配置 复选框。
启用此设置后,模型树中会出现一个隐藏的 作业配置 节点。在常规建模工作中,不需要担心这个节点。它主要存储与求解过程运行顺序有关的底层信息。通常,这种顺序由研究的顶层间接控制,无需启用 求解器和作业配置 选项。
右键单击 作业配置 并选择 序列 选项,添加 序列 子节点。
接下来,右键单击 序列 节点,查看 运行 选项下方的各种选项,这些选项可在运行序列时添加为顺序操作。
注:通过添加 序列 节点执行的所有操作也可以通过编写 Java API 代码和使用方法编辑器来实现。一般来说,在用户界面中执行的任何操作也可通过 COMSOL API 执行。
现在让我们创建一个简单的序列。右键单击 序列 节点,选择 解 选项。
一般来说,根据模型及其研究,不同的研究将定义多个求解器序列。在 解 节点设置的 常规 部分,运行 设置可指定要计算的求解器序列。默认情况下,全部 选项会为所有研究运行 求解器配置 下的所有求解器序列。通常,需要将 运行 设置为你打算运行的特定求解器序列。
在本例中,求解器序列 解1 (sol1) 包含 求解器配置 > 求解器 1 下所列的操作。同时,解数据结构 解存储 1 (sol2) 用作 稳态求解器 1 计算出的解的辅助存储,与解序列无关。因此,在这种情况下,我们将选择 解1 (sol1)。
求解器完成求解后,我们需要保存文件。为此,右键单击 序列 节点并选择 将 保存模型到文件。
在 将模型保存到文件 设置窗口中,可以看到一系列选项,用于保存一系列 MPH 文件,并在文件名末尾添加参数。这些选项对于 批量扫描等参数扫描非常有用。不过,在这种简单示例中,并不需要这样做,因此我们将为 将参数添加到文件名 设置中选择 无 选项。在此阶段,我们还需要为有写入权限的位置提供文件名。在本例中,文件名和文件路径为 C:\COMSOL\myfile.mph。
要运行这些操作,请选择 序列 节点并单击 运行。
我们使用的案例库模型微混合器已经定义了一个派生值。您可以在 结果 > 派生值 > 全局计算 中看到。该变量名为 S_outlet,是出口处的相对浓度方差,其定义位于 组件 > 定义 > 变量 下。
S_outlet 的值被发送到 表 1。我们可以通过更改 表 1 设置 窗口中的设置,将此值存储到文件中。将 存储表 设为 在文件中,并指定文件名,例如 C:\COMSOL\my_data.txt。
现在,在序列中添加 计算派生值 操作。
在 计算派生值 节点设置的 常规 部分,如果你想计算所有量,可以将 计算 设置从 全部 改为 全局计算 1。请注意,选择此选项后,模型树中的节点名称将变为 计算:全局计算 1。不过,在这个简单的示例模型中,只有一个模型树节点需要计算,可以省略这一步。
在 结果 部分,将 目标表格 更改为 表格 1(我们在此处定义了输出文件名和位置)。
再次运行序列前的最后一步是在 步骤 2:稳态 2 的 设置 窗口中启用 稀物质传递 接口 和 反应流,稀物质 选项,以求解物质传递(我们最初为了更快地运行模型跳过了这一步)。
现在,我们可以运行序列了。
要从主 研究 节点或命令行运行作业序列,可以使用 参数化扫描来代替上述方法。参数化扫描 是一种特殊类型的作业序列,与上述说明基本相同。不过,在这种情况下,作业配置 > 参数扫描 节点扮演了作业配置 > 序列节点的角色。
在添加 参数化扫描 节点之前,请删除作业配置 > 序列 节点及其子节点。
然后,在 研究 1 下添加 参数化扫描。这将自动创建一个 作业配置 > 参数化扫描 节点。但是,默认情况下,顶层 研究 节点不识别 作业配置 下的作业序列。同样,命令行接口也不允许在 研究 节点内直接执行作业序列;它只支持运行整个研究。在 全局定义> 参数 下添加一个虚设参数(例如,dummy = 1),就能为识别引入必要的识别机制,从而可以直接从 研究 1 或通过命令行执行。
对应的 参数化扫描 显示方式如下图所示:
现在,右键单击 研究 1 并选择 显示默认求解器。这将在 作业配置 下添加一个 参数化扫描 节点。
下图显示了对一个虚设参数的一个参数值的对应扫描。既然 参数化扫描 1 节点只是 序列 节点 的一种特殊类型,那么子节点 解1、将模型保存到文件 1 和 全局计算 1 的操作与上一个使用 序列 节点的示例相同,我们可以以同样的方式添加它们。
要从模型开发器运行作业序列,请右键单击 研究 1 节点并选择 计算。
如果希望使用命令行接口(如 Windows® 操作系统中的命令提示符窗口)运行作业序列,添加了虚设参数后,就可以键入如下命令:
comsolbatch -inputfile mymodel.mph -study std1,
其中,std1是 研究 1 的标签。
就像在 COMSOL Desktop® 上运行研究一样,该命令将执行一系列操作,包括求解、将模型保存到文件,以及最后对 全局计算 节点进行计算。请注意,如果模型中只有一个 研究 节点,则可以省略输入参数 study std1。
要显示模型树标记,请从模型开发器工具栏上的 模型树节点文本 菜单中选择 标记。
研究标记 std1 现在在模型树中可见:
请注意,如果模型中已经有参数化扫描,则每次扫描都将是 内部扫描 或 外部扫描。上例中使用虚设参数的扫描是 外部扫描。研究 节点会自动检测使用哪种类型的扫描以获得最佳性能,但您也可以根据需要手动确定。要使用命令行作业序列,你的扫描必须是 “外部扫描”。
几乎所有类型的扫描都可以从内部扫描变为外部扫描,但反之则不行。内部扫描可以更快,因为它们会使用计算的一些底层结构来加快速度。然而,并非所有类型的扫描都可以是内部扫描。例如,对几何参数的扫描必须是外部扫描;同样,求解器会自动处理。要确保参数扫描是外部扫描,请将参数化扫描设置中的 使用参数求解器 更改为 关;然后执行 显示默认求解器 操作并继续。
求解模型后,作业序列可用于自动执行许多常见任务。在这篇博客中,我们演示了如何:
你还可以自己尝试其他使用工作序列的任务,包括:
希望作业序列能成为您日常建模工作中的一项有用功能!
Oracle 和 Java 是 Oracle 和 / 或其附属公司的注册商标。Microsoft 和 Windows 是微软公司在美国和/或其他国家的注册商标或商标。
在之前的博客中,我们探讨了如何在 研究 节点下设置一系列程序化操作,用于求解模型、将模型保存到文件,以及将数据导出到文件。这篇博客,我们将在此基础上,展示在 COMSOL Multiphysics® 软件中求解模型后,如何自动导出完整的图像序列。
编者注:本文最初发布于 2017 年 7 月 11 日,之后对部分内容和图片进行了更新。
为了演示这项功能,我们将延续前一篇博客在 COMSOL 中求解模型后,如何使用作业序列保存数据的方式,首先从案例库中加载微混合器教程模型。该模型位于 COMSOL Multiphysics > 流体动力学 文件夹中,它演示了层流静态混合器中的流体流动和质量传输。
该模型使用 层流 接口进行流体流动模拟。接下来的步骤中,模型演示了如何利用流体流动模拟的结果作为输入,通过 稀释物质传递 接口计算混合效率。组分将根据流体的流速被输送到下游。
此模型计算耗时约数分钟。在上一篇博客中,我们通过不求解 稀释物质传递 部分来加快计算速度。本文,我们需要计算整个混合器中的浓度分布。为了更快地运行计算,我们可以将 预定义单元大小 设为 极粗。
此网格粗化步骤为可选操作,后续流程不受此设置影响。
下文演示了如何使用参数化切面图和动画导出一系列的图像,其中每个图像对应一个切面。
下图是模型库中已求解的示例模型在 x 方向上 5 个不同的 yz 平面上默认绘制的速度切面图:
接下来,创建一个类似的浓度切面图。右键单击 速度 (spf) 节点并选择 复制。在新创建的绘图组中,将名称改为浓度,将 表达式 改为 c 表示浓度:
在 浓度切面 图中,您可以将 平面数据 输入方法更改为 坐标,而不是默认的 5 个均匀分布的切面。这样,就可以生成 0.5 mm 处的单个切面,如下所示。
结果如下图所示:
可以通过 结果参数 对切面的位置进行参数化。右键单击 结果 节点,然后选择 参数。
定义一个参数 xcut 值为 -3.5[mm](微通道在 x 方向 -3.5 mm 至 8 mm 范围内变化)。
对于 浓度切面 图,在平面数据 部分,在 x 坐标的编辑框中输入 xcut。
上述设置对应的切面图显示如下:
如果要导出不同切片位置的图像序列,该怎么操作?您可以使用基于文件导出的动画来实现。
如下图所示,可以从功能区工具栏的 动画 菜单中选择 文件 生成动画。
或者,您也可以右键单击 结果 下的 导出 节点,然后选择 动画 > 文件。
在模型树中 动画 节点的 设置 窗口中,将 主题 更改为 浓度。然后选择 图像序列 作为 输出类型。
假设您的系统中有一个 C:\COMSOL 文件夹,可以这样输入 文件名,如 C:\COMSOL\my_image.png,你也可以输入任何有写入权限的文件夹。
要将导出文件链接到参数 xcut ,请将 序列 类型更改为 结果参数,这可以在 动画编辑 部分设置。
选择 xcut 作为 参数, 起始值 设置为 -3.5, 停止值 设置为 8, 单位 设置为 mm。
在 动画 设置窗口顶部,单击 导出 开始生成图像。图像的后缀将与序列中的编号相对应。帧数或图像数在 帧 部分设置。
这样就会生成一系列图像,名称分别为:my_image01.png、my_image02.png、……、my_image25.png,如下图所示。
现在,我们来看看在 COMSOL Multiphysics 中求解模型后,如何自动生成图像。
要在 研究 节点下定义操作序列,请启用 求解器和作业配置。此选项可在模型开发器工具栏上的 显示更多选项 对话框中找到。单击眼睛图标即可打开对话框。
在出现的 作业配置 节点下,选择 序列。我们在上一篇博客中对此步骤进行过描述。
右键单击 序列 并选择解。在 解 设置窗口中,如果尚未选择,请选择 全部,确保运行所有研究步骤。
右键单击 序列,然后选择 结果 > 导出到文件。
在 导出到文件 设置窗口,选择 运行 选项下的 动画 1。在这个简单的示例中,导出 选项下仅有一个节点,因此,我们也可以保留默认的 全部 选项。
要使用 序列 求解,请右键单击并选择 运行。或者,点击 序列 设置窗口顶部的 运行 按钮,再次运行整个模型,并在求解后导出图像文件。
上文我们使用导出操作生成了一系列三维图像。如果要为每个切面生成一系列二维图像,该怎么操作?这可以通过使用参数化的 截面来实现。
右键单击 数据集 节点,选择 截面。
在 截面 设置窗口中,输入 xcut 作为 x 坐标。
已经存在的三维绘图组不能生成二维绘图,因此右键单击 结果 并选择 二维绘图组。
在 二维绘图组 设置窗口中,选择 截面1 作为 数据集。
在 二维绘图组 下添加一个 表面 绘图节点,并将 表达式更改为 c,对应于浓度。
要整理绘图组列表,请将 二维绘图组 的名称改为 截面浓度。
现在,转到模型树中的动画节点。在相应的 设置 窗口中,将 主题 更改为 截面浓度。
单击 导出 生成二维图像序列,如下图中的文件浏览器视图所示:
要使用 Windows® Explorer 获得此视图,请将视图更改为大图标。
与之前的示例一样,现在我们可以继续运行 作业序列 求解,就可以自动生成图像集并保存到文件中。
想亲自尝试本文中演示的示例模型吗?请单击下面的按钮访问 MPH 文件。
Microsoft 和 Windows 是微软公司在美国和/或其他国家的注册商标或商标。
参数估计很少有醒目的插图,但往往对获得准确的材料数据,从而获得准确的模拟结果起着重要作用。它涉及最小化测量的实验结果与模型中的相应数据之间的差异。有时你可能需要结合几个实验的数据,就需要设置适当的权重,使所有的实验都能为估计的材料参数贡献信息。最大似然参数估计提供了一种根据客观标准自动选择权重的方法,以便从实验中提取最大数量的信息。
最小二乘法是最大似然参数估计的一种特殊情况,它是基本参数估计的一个很好的起点,因此是一种很受欢迎的方法。COMSOL Multiphysics® 软件内置支持最小二乘法。
在这篇文章中,我们将演示如何利用最大似然参数估计来帮助避免为给定问题手动调整权重。

在这个示例中,两个参数的相对误差取决于为两组测量选择的权重。因此,准确地确定这两个参数需要在两个权重之间找到一个很好的折衷方案。
对于一个概率密度函数 ,在一定范围内
对一个数据点进行采样的概率
,以积分的形式给出
在这种情况下,我们只考虑测量点 周围的无穷小的范围
,所以概率变为
从这个意义上说,概率密度函数与由 给出的概率之间存在直接关系。(为方便起见,
可以省略。)

可以通过对概率密度函数进行积分来计算对某个值进行采样的概率。
可以考虑模拟和实验之间的不同差异来源。在下面的例子中,我们将考虑来自实际测量的正态分布的不确定性,因此测量值 的概率变为
其中, 是测量误差的标准偏差,
是平均值。对于
次测量,我们可以将联合似然计算为乘积
我们可以取似然的对数来避免乘积和任何相关的数值计算困难。作为替代我们得到一个总和,类似于最小二乘目标:
在某种意义上,我们可以说 在最小二乘目标中起到了权重的作用。因此,为了使可能性最大化,我们需要使方程的右边最小化,并且不用考虑
的取值,当平方差的和取最小值时,方程右边就会出现最小值。如果不同的测量结果集合中的
值也不同,就不能得出同样的结论。接下来,我们来看这样一个例子。
通常通过压缩试验来估计材料的泊松比,但为了便于演示,我们以一个使用拉伸试验来估计泊松比和杨氏模量的示例来说明。我们通过测量下图所示试样的拉伸力和径向收缩来实现。

该图显示了拉伸试验的应力。力和中心径向位移被测量并表示为拉伸量的函数。
力和位移测量数据之间存在大约 10 个数量级的差异(SI 单位),所以使用常规的最小二乘法,我们需要调整最小二乘目标的权重来获得两个材料参数的准确结果。然而,我们可以通过两个测量误差 和
的标准差作为控制,使用最大似然法自动计算出最佳权重,即:
COMSOL Multiphysics 内置的最小二乘法目标法,让使用自定义目标来解决最大似然参数估计问题变得相当简单。COMSOL 案例库中提供的使用最大似然法进行参数估计模型,通过添加正态分布的噪点数据来生成合成数据。该模型在这些数据的基础上恢复材料参数和标准差,由此产生的力和径向位移如下图所示。

噪点数据和优化模型行为被绘制为拉伸量函数。两次测量都有 37 个数据点。
该模型能够将材料参数恢复到 0.1%-0.5% 的准确度和 6% 左右的标准差,预计准确度会随着测量次数的增加而增加。
在这篇博文中,我们只介绍了符合正态分布的噪点数据并且其标准差不变的情况,但最大似然参数估计还可以扩展到适合更多且更通用的情况,并且提取和估计信息时也能够保证数据的一致性和最优性。
单击下面的按钮,进入 COMSOL 案例库,自己尝试使用最大似然法进行参数估计模型。
您还可以通过下面这些模型来探索更多参数估计的示例:
查看以下资源,了解有关参数估计的更多信息:
COMSOL Multiphysics® 软件中的 图形 窗口和 图形 工具栏可用于简单直接地对结果进行常规后处理,只要您了解这些功能背后的原理和更高级的技巧,就可以操控相机和视角,创建出高质量的视觉效果,获得既美观又包含各种信息的视图。
编者注:这篇博客最初由 Lexi Carver 撰写,发布于 2014 年 3 月 19日。现在已经更新,以反映新增的后处理功能。
在 COMSOL 软件中,通过鼠标点击和移动 图形 窗口以及 图形 工具栏按钮对几何视图进行直接处理的方法有很多。所有的视图改变都会显示在 视图 节点中,包括一般视图和照明选项,环境遮挡视觉效果;环境、透明度和剪裁设置。

选择了 视图 节点的 模型开发器 窗口,显示了为模型添加阴影的 环境光遮蔽 复选框等视图设置。图形 窗口显示了无人机机身拓扑优化模型的仿真结果。
COMSOL 中有多方法可以操控相机来获得更吸引人和信息丰富的视图。比如,您可能希望在查看一个较大模型的同时,放大模型中一个小关注点;或者你的模型可能具有高纵横比。在这些情况下,操控相机有助于显示模型中重要的部分。


一个超音速喷射器,前景中的入口是我们的一个关注点,后景中的出口也可以看见(左)。曲轴的网格,前景中可以看到网格单元,但仍保持完整的模型(右)。
所有称职的摄影师(不管是业余的还是专业的)都知道,光照对于任何一张显像良好的图像都非常重要。但是使用 COMSOL Multiphysics 工作时就不一定需要了解这些,通常软件默认的照明设置就足够了。当然,照明确实有助于在正确的场景中展示模型。以下图中万圣节主题的南瓜模型为例,我们可以使用软件中的各种照明功能在镂空的南瓜中创建出蜡烛产生的独特的黄光。

南瓜内的黄色点光源产生了黄色光晕,使用软件内置的 环境光遮蔽 特征可以添加阴影。
你可能会想:这些效果都很好,但我还想看到一些能显示实际物理场的结果。下图中的模型使用 COMSOL 6.0 版本软件传热模块的新功能,模拟了一个用火炉加热的房间内的表面对表面辐射。热量通过辐射传递到周围的表面,再经传导扩散到家具中。模型中添加了一个照明特征以突出显示模型表面辐射热通量的可视化效果。有关照明特征和相机功能,请阅读 COMSOL 学习中心的文章 使用图形窗口,了解更多详细内容。

由火炉加热的房间内表面的辐射热通量。
我们一直在讨论如何修改 视图 节点,来突出模型(和仿真结果)中关注点的方法。视图 节点的另一个用处是能够在预处理和后处理中隐藏一些几何实体。同样,这个功能可以直接从 图形 工具栏访问,不过操作此功能获得的结果却是通过 视图 节点访问的。隐藏实体是大多数仿真中使用的一种技术,因为很多情况下,一些重要的结果会被壁挡住而无法看到。在下面的三个示例中,如果我们不隐藏一些不关注的部分,就无法查看结果。您可以阅读 COMSOL 学习中心的文章如何选择几何,了解如何使用隐藏功能。
要了解如何使用文中讨论的特征和更多用户界面功能,请查看 COMSOL 学习中心的课程,了解如何在 COMSOL Multiphysics 中浏览用户界面。
反馈控制系统理论中运用了全状态反馈的概念,使配置系统的所有闭环节点成为可能。极点对应于系统的动态行为,因此将它们配置在一个期望的位置可能非常有趣。在 COMSOL Multiphysics® 软件中,我们可以使用状态空间控制器插件为系统模型添加一个全状态空间反馈控制器。这篇博客,我们简要回顾了全状态反馈,描述了如何使用该插件,并演示一个示例。
全状态反馈假设系统的闭环动力学在形式上可以表示为
如果 ,只要系统是可控 的,我们就可以通过求解特征方程来任意配置系统的极点。
使用插件,我们能够在模型中实现一些功能。从 5.6 版本开始,COMSOL Multiphysics 提供了一个状态空间控制器插件,可以配置闭环系统的极点。
有关控制器插件的另一个示例,请参阅博客文章:如何使用 PID 控制器插件模拟控制系统。

状态空间控制器插件的 设置窗口。
我们可以先定义所需系统的观测变量的数量,矩阵 和
,矢量
,初始条件,以及在复平面中配置极点的位置。然后使用插件创建一个新的零维模型组件,该组件使用全局方程 定义反馈控制器。信息 部分提到了相关的组件,以及创建控制器后如何访问输出变量。控制变量可以用作
。
下面介绍一个如何使用插件的示例。
以一个描述质量为 的质点的系统为例, 一侧连接到带有弹簧和阻尼器的墙壁上,另一侧用弹簧和阻尼器连接到第二个质量为
的质点。第二个质量点又受到一个力
的作用,为了达到平衡,这个力需要被控制。

该系统由以下方程描述,这些方程是牛顿第二运动定律的实例,使用点符号表示时间导数:
式中, 和
是两个弹簧的弹簧常数,
和
是两个阻尼器的阻尼常数,
和
用于描述两个质点与其各自平衡位置的偏差。
引入四个新变量, 和
,我们得到一个系统形式为
其中,
在这种情况下,控制变量 ,
是力,
是单位矩阵。我们将常量定义为参数,如下所示。

常量的定义。
我们现在可以使用状态空间控制器插件来配置闭环系统的极点。假设我们想要四个实极点,都为-0.5。由于我们有四个可观察量,设置如下所示的插件。

双质量阻尼器系统的状态空间控制器设置。
选择初始条件,使得第一个质量块开始于负 方向 1.3 m,速度为 0.2 m/s,第二个质量块从静止开始,从它的平衡点向正
方向 1.3 m。
单击创建 后,会收到以下消息。

状态空间控制的输出变量的描述。
现在,我们可以运行研究,假设质量点在平衡状态下相距 3 米,我们可以绘制变量 和
,以看到它们位置的时间演变。因为
和
是两个质量点的平衡位置的距离,所以当两个质量点相距 3 米时,质量 2 与质量 1 的平衡位置的距离是
。

前 25 s 内两个质量点的位置,此时所有极点都位于 -0.5。
我们还可以绘制作用力,它可以通过控制变量 访问,得到以下绘图。

在模拟的前 25 s绘制控制变量,此时所有极点都位于 -0.5。
假设我们对上述系统的稳定时间不满意。从控制理论来看,如果我们将极点进一步配置在负实平面中,预计稳定时间会减少。如果我们按照上面的程序,将所有极点配置在-1 而不是 -0.5,就可以获得下面的位置图。

前 15s 的位置图,此时所有极点都位于 -1。
此外,我们还可以得到如下所示的受控力图。

前 15 s 的受控力图,此时所有极点都位于 -1。
正如预期的那样,系统稳定得更快。
在状态空间控制器插件中,还可以在复平面中配置极点。复极点总是以复共轭对的形式出现。

具有两个复极点的状态空间控制器设置。
这个结果会产生如下图所示的位置和控制信号图。
两个实极点分别位于 -0.5 和两个复极点位于 -1+2i 和 -1-2i 的位置图(左)。两个实极点(-0.5)和两个复极点(分别为 -1+2i 和 -1-2i)的控制信号图(右)。
从上一节的模拟可以看出,系统的行为会发生巨大变化,具体取决于闭环系统的极点配置的位置。很难找到关于极点配置如何影响任意系统的一般描述。但是,如上所述,可以说配置连续系统的极点应该会使稳定更快,但可能会导致更大的控制信号。使用状态空间控制器插件,您可以轻松评估各种极点配置的系统行为。
今天我们将为您介绍 COMSOL Multiphysics® 软件中一个强大的工具——状态变量。你将学习如何用它们生成分形,例如著名的芒德布罗集合(Mandelbrot set),也就是所谓的分形噪声。生成分形不是状态变量的最典型应用。但是,这篇博客文章提供了一种有启发性、有见地并且有趣的方式,可以帮助你更多地了解如何使用状态变量、复数算法和随机数。
广义上讲,分形是指物体在不同尺度上表现出某种形式的自相似性。这听起来可能很抽象,但是分形模式实际上广泛存在于自然界中——无论你是否注意过,你都可能遇到过它们。
例如,蕨类植物会显示出分形模式。下图中所示的每个蕨叶由较小的分支或细分,即所谓的 羽状叶(pinnae)组成,它们沿着主茎生长,并显示出与主叶本身相似的模式。单个羽状叶又由较小的细分(细齿)组成,在某些蕨类植物中,细齿 可细分为更小的部分。


自然界真实的蕨叶和计算机合成的 Barnsley 蕨。
数学对应体的发现是受自然界中发现的植物图案启发的,即Barnsley 蕨。蕨叶的这种数学表示可以在具有迭代功能的计算机上生成,这个迭代功能只需要几行代码就能完成。生成的图像类似于蕨叶,就像真实的蕨叶一样,它由细分形状组成,这些细分形状与主叶片本身相似。实际上,Barnsley 蕨经常会无限细分为较小的自相似形状,而真实蕨类植物中的自相似性仅能保持几个水平。
分形除了具有吸引人的外观外,还具有各种实际应用,例如分形单极天线和超材料研究。另一个应用是计算机生成图像,例如在计算机游戏中模拟自然物体,像风景、云彩、树木或其他植物。在这篇博文的后面部分,我们将展示如何使用分形模式生成看起来逼真的景观图像。
也许最著名的一个分形是芒德布罗集合。简而言之,它是由一个简单的迭代函数产生的一组复数。如果将复数插入到某个迭代函数中,且绝对值经过多次迭代后不会发散,则将其视为集合的一部分。要检查一个数是否是集合的一部分,我们只需要将它插入下面的公式中就可以了:
例如,我们可以尝试用数字 代入。第一次迭代产生
(
),第二次迭代产生
(
),第三次迭代产生
(
),等等。在这种情况下,绝对值
似乎发生了发散,所以,
不属于芒德布罗集合。
实际上,在 COMSOL Multiphysics 中计算芒德布罗集合非常简单。为此,我们创建了一个二维几何,可以将其理解为一个复平面。每个点 在这个平面上代表一个复数
,我们可以将这些点插入迭代方程中。我们必须跟踪之前的结果
,来计算下一个数
。
对于从之前的计算步骤中跟踪数据的情况,状态变量 特征是一个方便的工具。在状态变量 特征中,我们可以根据需要定义尽可能多的变量。在计算芒德布罗集合时,我们定义了两个变量,分别是 zn 和 aura。

定义状态变量。
在任何给定的迭代步骤以及复平面中的任何给定点,第一个状态变量跟踪当前的值。我们在 初始值 列中对 zn 进行初始化。该更新表达式 是我们的迭代函数,通过这个函数我们将结果 zn 的平方从之前的迭代中添加到。我们还添加了另一个名为 aura 的状态变量,并将字段初始化为零,存储所需的迭代次数,直到 zn 的绝对值大于 2。
可以证明, 最终会发散,如果
在某些迭代步骤中。如果我们对这些函数进行两次迭代求解并绘制结果图,我们将看到芒德布罗集合出现,如下面动画所示。
芒德布罗集合及其经过 25 次迭代计算的“光环”。
黑灰色形状代表复数,是芒德布罗集合(变量 zn)一部分。在每次迭代中,我们都更接近实际作为集合一部分的数。不同的灰色阴影表示绝对值 zn。对于一些初始值,迭代函数不会收敛到单个值,而是会在不同的值之间跳转,在动画中,它看起来有点像光源被打开和关闭。芒德布罗集合外的彩色字段表示光环,它指示发散的速度。越接近芒德布罗集合的边界,在绝对值大于2之前越需要进行多次迭代。

螺旋结构位于中心位置,使用 300 次迭代计算得出。图像的宽度为0.01,高度为0.00666。
现在我们已经了解了分形和状态变量的要点。接下来,我们来看看分形在计算机生成图像领域中更实际的应用。更具体地说,我们将研究如何使用所谓的分形噪声来模仿逼真的纹理。这项技术实际上已在 COMSOL Multiphysics 中用于实现各种材料的逼真可视化,这将在后面讨论。分形噪声的另一个常见应用是在计算机游戏中以程序的方式生成看起来自然的地形。
我们使用噪声创建一个人造景观。这里,我们将噪声理解为一些随机值。换句话说,我们正在寻找一个函数,即 noise(x, y),该函数以两个坐标作为参数并返回一个伪随机数。结果被解释为给定位置处的地形高度。使用 COMSOL Multiphysics 中的随机 函数,我们可以创建白噪声(详可参看这篇博客文章:从概率分布函数中抽取随机数)。如果将结果绘制在 xy 平面上,这些数将随机且独立地从一个坐标跳到下一个增量。显然,这看起来与现实世界中的任何景观都不一样,因此我们需要一种更好的方法。

白噪声分布均匀。值在一些最小值和最大值之间随机跳跃。
我们正在寻找一个产生随机值的噪声函数,同时该函数不应显得“太随机”而应显得自然一些。相邻点之间应该有一些连贯性。由 Ken Perlin 开发的佩林噪声是一种特殊的噪声形式,它允许我们为给定坐标生成伪随机值,并且噪声值从一个点到相邻点的过渡是平滑的。这种“平滑的随机性”看起来更像自然界中发现的模式。

生成二维佩林噪声:(a)网格定义。红色箭头是随机生成的梯度矢量(按 0.5 缩放以更好地显示)。蓝色箭头从周围的网格指向某个位置。(b)使用左下梯度矢量的第一个点积的绝对值。灰度表示介于 0 (黑色)和 1(白色)之间的值。(c)内插噪声。
生成佩林噪声涉及上面概述的几个步骤。第一步,将 xy 平面划分为单元正方形网格点。在每个网格点处,生成一个长度为 1 的伪随机矢量,该矢量也称为梯度矢量(红色箭头)。与一个点关联的四个周围的梯度矢量 只是伪随机的,因为当我们在同一点重新计算噪声时,它们应该始终相同。利用梯度矢量,我们可以开始计算位于平面内任何位置的某个点的噪声值
。对于这个给定的点,计算梯度矢量之间的四个点积,以及从网格指向所选点自身的位置矢量
(蓝色箭头)。
四个点积可以解释为梯度对所选点处的噪声水平的影响。梯度矢量 以及位置矢量
之间的点积,会达到最大值,当两个矢量指向同一个方向时;而当两个矢量相互垂直时会达到最小值。生成佩林噪声的最后一步是计算四个点积的加权平均值并返回插值。这涉及精巧选择的平滑步长函数和线性插值,可确保我们在自己的域上获得平滑过渡。有关如何计算佩林噪声的更多详细信息,请参见 参考文献1。
上面我们生成的佩林噪声具有非常平滑的过渡,并且可能看起来不像大多数现实世界中的地形那样。在该地形中,我们通常会发现更多局部不规则性,可能是来自山丘或较小的岩石。我们该怎么模拟呢?一个解决方案是叠加不同的噪声八度,这就是分形概念起作用的地方。基本上,我们会以更高的频率产生更多的噪声,换句话说,在相同的距离内会产生更多的峰谷。就像音乐中一样,频率每倍频增加一倍。降低高频噪声的幅度,并将其添加到基本噪声中。原则上,我们可以添加任意数量的噪声八度。因此,我们不再只调用一次函数 noise(),而是多次调用该函数,然后将结果与调整后的幅度相加。
如果我们将 解释为我们景观的高度,第一次迭代(
)得出具有大的、明确特征(例如山脉)的地形的第一个平滑近似值;第二次迭代可能来自更多的当地丘陵和洼地;第三次迭代可能来自单个巨石和岩层;等等。

一维分形噪声(顶线)。以下是佩林噪声的前三个频率,这些频率加在一起后,就形成了顶部的线。
产生分形噪声涉及计算和叠加不同频率的噪声。在 COMSOL Multiphysics 中进行此操作时,再次方便地使用状态变量,因为我们要“记住”以前所有频率的合成噪声。以下动画表示二维高度图,其中,随着每个级别的高频噪声的出现,地形中越来越多的细节出现,该噪声被添加到基本噪声中。
我们可以在物理模拟环境中使用随机化的表面几何形状,例如,需要模拟表面粗糙度或不均匀的材料。在之前的博客文章中,我们展示了一种通过叠加具有变化幅度和频率的三角函数来创建随机表面几何形状的不同方法,以及从图像或文本文件创建任意几何形状的方法。
你是否知道我们还可以在绘图中添加分形噪声来改善 COMSOL Multiphysics 中的材质外观?从 5.6 版本开始,材料具有特殊的可视化选项。某些内置材料类型,例如生锈的钢、皮革和水,会使用单纯噪声创建更逼真的纹理。单纯噪声与佩林噪声相似,并且也由 Ken Perlin 开发。你可以自己调整噪声参数以获得所需的效果。

海啸冲上莫奈山谷海滩的复杂三维模型中利用单纯噪声可视化水。

使用 Simplex 噪声可视化具有生锈钢表面的扳手的应力和应变模型。
想不想自己尝试模拟文中讨论的芒德布罗集合或佩林噪声?单击下面的按钮访问MPH文件,就可以动手操作了~
阅读下面相关博客文章,了解有关分形、噪声和状态变量的更多信息:
今天的文章作者来自于我们规模最大、历史最悠久的客户。这家客户非常著名,总部位于北极圈内,大多数时候人们可能会忘记他们的存在,但他们一直在留意着我们。他们一直拥有完美的客户满意度,但今年由于特殊原因,他们对圣诞季的产品配送任务有些顾虑……接下来,让我们一起了解 COMSOL 与这个来自北极圈的特殊客户的故事吧!
随着年末的来临,我们的精灵团队正在礼物工厂中努力工作,为所有的小朋友和大朋友们准备各种玩具和礼物。您也许会认为我们是一个非常传统的组织,实际上我们的产品一直在使用最先进的技术,例如,我们的生物发光研究成果可以帮助圣诞老人照亮夜行的道路。
多年以来,我们一直使用 COMSOL Multiphysics® 软件进行产品研发。最近,我们使用 COMSOL Multiphysics 5.6 最新版本中的新功能解决了一个技术难题。
几天前,圣诞老人的太太克劳斯夫人很急切地找到我。她告诉我,由于疫情原因,圣诞老人今年一整年都待家里社交隔离,一不留神就吃了太多的饼干,胖了一大圈。克劳斯夫人担心今年圣诞老人可能会因为太胖而无法钻进所有的烟囱,造成一些礼品无法派送。她很友善地为我们提供了圣诞老人近期的照片,以及其他详细参数。

一个典型的问题描述。
我们意识到,这个问题可能会导致我们的礼品派送工作发生严重的中断,需要立即采取行动。说实话,这对我们来说并不是一项常规任务,所以我们联系了 COMSOL 技术支持部门,并询问他们如何最好地解决这个问题。一向乐于助人的 COMSOL 技术工程师立即向我们提供了一些有用的资源,并助我们一臂之力。
我们可以使用 COMSOL 5.6 版本中结构力学模块的新功能——动态接触功能来分析这个问题,另外还可以通过这篇文章(如何利用一个附加组件将图像转换为几何模型)介绍的方法直接将圣诞老人的照片导入 COMSOL 软件中。同时,我们还可以通过虚拟实验快速获取材料属性。只要做好了这些准备,我们就可以创建一个模型来模拟在派送礼物过程中,圣诞老人通过烟囱的场景。
下面,让我们来看看模拟结果…
太好了,圣诞老人可以通过!
看到仿真的结果,克劳斯夫人非常高兴,并感谢所有精灵们的努力工作——无论是在北极为大家精心制作礼物的精灵,还是在 COMSOL 技术支持团队中为用户提供帮助的精灵。
最后,COMSOL 祝大家圣诞快乐,平安健康,并祝 2021 年万事如意!
Winter Frost 是圣诞老人工作室的高级精灵工程师,专门负责拐杖糖的产品派送和形状优化。
借助多物理场仿真技术,诺斯罗普·格鲁曼公司(Northrop Grumman Corporation,NGC)快速完成了声呐系统的创新设计和实现。Lauren Lagua 是 NGC 水下系统部门声呐集成团队成员之一,她在 2020 年北美 COMSOL 用户年会的主题演讲中,讨论了如何使用 COMSOL Multiphysics® 软件在声呐系统开发中进行快速原型设计。文中摘录了她的一些演讲内容,并附加了完整的视频演讲,欢迎浏览。
在 NGC 公司,工程师遵循着快速原型设计的流程,该流程包括四个部分,其中前三个部分经常重复多次:
Lauren Lagua表示,在该流程的每一个环节都使用了多物理场仿真技术。
在为声呐系统设计换能器(Tonpilz 型压电换能器案例模型)时,工程师会通过测试不同的参数设置,来了解如何最好地实现项目的总体目标。他们可能会尝试测试材料(例如新的压电材料)、几何形状和频率等参数。Lauren 团队使用 COMSOL Multiphysics 的 压力声学、固体力学、静电 和电路 接口,确定了不同的参数变化如何影响其设计。
在测试新材料时,团队经常缺少供应商提供有关材料属性的所有必要信息。因此,他们使用 COMSOL Multiphysics 评估已有信息测试材料属性,并将评估结果与 COMSOL 模型进行比较来估计材料性质。

主题演讲的屏幕截图,显示了换能器设计中使用的材料。
NGC 团队在建立好模型并运行之后,会在整个原型制造过程中执行一系列测试,并将其与模拟结果进行比较。有时结果会不匹配,例如模型中可能缺少物理场。有时,Lagua能够在原型中发现制造问题。例如,当将压电材料黏合到背衬基板时,可能会出现气泡或黏合不良等问题。
Lagua 对导致问题的原因进行了假设,并在 COMSOL Multiphysics 中模拟了其假设。通过将模型结果与原始原型的假设进行比较,Lagua 能够快速对制造问题进行故障排除并纠正。
准备好原型后,NGC 团队将对其电气和声学特性进行系统级测试。
电气测试包括阻抗测试和电容测量。
在声学方面,NGC 公司使用了最先进的声学测试设备。该设备是私营企业最大的测试池,直径为 15 米,可容纳约 1500 立方米水,并用红木衬砌,以建造一个理想的宽带声学测试环境(模仿开放水域环境)。声学测试池用于测量声呐换能器中的发射电压响应,远场电压灵敏度和辐射方向图。该设备的测试结果将被反馈回模型中,并进行验证模型,或者在必要时进行调整。

声学测试池。图片由 Northrop Grumman Corporation 提供。
一旦设计通过了快速原型设计流程的前三个阶段,就可以一次又一次地快速迭代它们,直到准备好制造出最终设计版本为止。
在 Lagua 的主题演讲中,她以 NGC 公司的一个项目为例说明了如何借助仿真快速实现声呐系统的原型制造。该项目成功使用 COMSOL Multiphysics 软件实现了快速原型设计。μSAS
系统是一种用于微型无人水下飞行器的双侧侧扫声呐。这些小型飞行器的直径约为 0.15 米,并已经预先编制了任务编程。

主题演讲的屏幕截图展示了 μSAS
系统。
由于设备的规模小,因此对尺寸、重量和功率有严格的设计限制。Lagua 的目标是在小型设备中开发出尽最佳的声呐,同时还可节约能源。最后,NGC 团队设计了一种在两侧均带有声呐的设备,该设备可实现干涉测量过程。这意味着该微型无人水下飞行器的声呐系统可以插入 3D 图像。
借助 COMSOL Multiphysics 软件,NGC 公司团队能够快速进行设计、原型制作、测试和验证,有时甚至仅需要一周时间!正如 Lagua 在演讲中提到的那样:“ COMSOL 推动了 NGC 公司的设计、创新和进步,对我而言也是如此。”
了解有关 Lagua 在 Northrop Grumman 公司使用仿真和快速成型和缩短产品开发周期的更多信息,请观看本文开头的主题演讲视频。
μSAS 是 Northrop Grumman Corporation 的商标。
你知道如何从命令行运行同一个模型文件的多种工况并自动导出数据吗?我们只需要在 COMSOL Multiphysics® 软件的用户界面(UI)中进行少量准备工作,就可以使用方法来扩展模型文件,在方法中通过命令行自动实现许多模型的设置和计算。下面,我们来看看如何操作……
以在 COMSOL® 软件介绍中使用的模型——母线板教程模型 为例来演示如何操作这一工作流程。该模型具有多个需要研究的参数化输入以及需要得到的输出。
首先,将模型中的一些数据写入硬盘。我们的模型已经建立了多个绘图,包括其中的一个温度场。右键单击此特征,然后选择 添加要导出的图像 选项,将获得结果 > 导出 > 图像 特征,其设置如下面的屏幕截图所示。在这些设置中,键入输出文件名。请注意,我们还可以根据需要调整图像 和布局 设置。我们可以添加一些类似的特征,并导出其他类型的数据,包括动画、网格信息等。如果要一次性写出所有这些数据,请右键单击导出 分支,然后选择全部导出 选项。

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

该屏幕截图显示了 计算组,将数据组合并写到文件中。
最后,结合计算组 和导出 特征,我们可以从模型中写出任意数量的数据。现在,让我们看看如何进一步实现自动化操作。
我们需要 Microsoft® Windows
操作系统来使用模型方法,因为我们将使用 App 开发器 功能。单击功能区中的 App 开发器 按钮,或使用键盘快捷键 Control + Shift + A,将进入下图所示的界面。此处我们需要做的是在方法 分支中添加一个新方法,并为其命名,例如,my_method,但是先不添加任何内容。通过左上方的按钮或键盘快捷键 Control + Shift + M 返回到模型开发器。

建立了一个方法的 App 开发器屏幕截图。
回到模型开发器,添加方法调用。右键单击全局定义,然后转到方法调用 子菜单,我们将在其中看到我们刚刚创建的方法。添加并确保更改标记 字段。通常,我们可以使用与App开发器中相同的名称。我们可以在下面的屏幕截图中看到方法调用 特征具有三个按钮:
编辑方法 按钮是一个快捷方式,可以便于切换到 App 开发器,一旦我们需要在方法中添加代码时就可使用此功能。

在模型开发器中添加方法的调用,使我们能够运行和编辑该方法。
如果对编程不是很熟悉,那么我们可以执行以下操作:方法包含代码片段,其中每行代码包含在模型上的某种修改或操作。有 2 种方法可以从模型开发器中提取这些代码片段。
第 1 种方法是转到开发工具 选项卡,然后单击录制方法。接着,我们可以在模型开发器中执行一系列完整的操作,直到单击停止录制 按钮。相关代码将保存到新方法中。
在第 2 种方法中,右键单击模型树中的特征,并且(在大多数情况下)我们将看到作为代码复制到剪贴板 子菜单。在模型的研究 分支上进行尝试,其中一个选项是运行。选择此选项可将用于运行的代码片段复制到剪贴板。转到方法编辑器并粘贴(Control + V)以查看代码:
model.study(“ std1”).run();
第 2 种方法比较简单,因此我们在这篇博客文章中使用了此方法。

复制用于运行模型树的特定节点的代码。
我们可以添加更多代码来自动执行数据提取。我们已经设置了将数据写到硬盘的功能,现在只需要在我们的方法中包括这些功能的运行即可。右键单击导出 特征,然后在运行命令中再次使用作为代码复制到剪贴板,如上所示。将其粘贴到我们的方法中,然后对计算组 重复此操作。完整的方法应如下所示:
model.study(“ std1”).run(); model.result().export().run(); model.result().evaluationGroup(“ eg1”).run();
由于我们正在通过方法写入硬盘,因此我们可能还需要更改一些默认的安全首选项。进入文件菜单 > 首选项 > 安全性,并允许访问所有文件的文件系统。此设置显示在下面的屏幕截图中。否则,我们将只能写入临时 和 App 文件 位置,此部分通过文件菜单 > 首选项 > 文件进行指定。

如果需要,修改安全性首选项以允许方法写入文件。
现在,当我们运行此方法时,将重新求解整个模型,并将新的数据和图像文件写出到硬盘。最后一步是从命令行完成所有操作,完全不使用用户界面。
保存此修改后的文件,将其命名为 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 在美国和/或其他国家的注册商标或商标。
你是否知道 COMSOL Multiphysics® 软件内置了一个符号微分求解器,在设置和解决非线性问题时会自动启用?此功能可确保软件在求解此类模型时具有很高的可靠性,但也要付出一些代价。今天,我们将通过几个不同的示例演示此功能,并研究其优点和弊端。
让我们从一个相对简单的、单自由度的非线性问题(隐式方程)开始:
其中, 表示系统的集总温度,
代表热载荷,上式当中的分母
代表系统热导率。
要求解参数 的不同值,我们可以通过阻尼牛顿法找到非线性问题的解,该方法可以通过在 COMSOL Multiphysics 中写残差来完成:
然后将其输入全局方程 接口,如下截图所示。

用于求解非线性方程的全局方程接口。
如下图所示,我们可以针对一系列不同的 值来求解此方程。

单自由度非线性问题的解。
为了便于说明,我们在下图中画出了 取值范围内和选定值
的残差。零交叉处的点是上图的解。

不同参数 值的残差图。与零交叉的
值就是非线性方程的解。
我们还画出了相同范围 的和
值下的残差的对应导数(雅可比矩阵)。

不同 值的残差的导数图。
我们看到,随着 值的增加,雅可比矩函数非线性增强。我们也可以(对于这种简单情况)手动写出其导数:
请记住,软件能够自动通过符号微分获得此导数,并在牛顿步骤中使用它。
可以看出,正是残差第二部分的分母使该表达式有些复杂(回忆下,该项可以被认为是系统的热阻)。事实证明,如果我们愿意,可以忽略该项,通过 nojac() 算子包裹分母的该项:
R(T) =(T – Q/nojac(1+T^2/100))
并修改全局方程,如下截图所示。

屏幕截图显示了如何使用 nojac() 算子。
结果,符号微分求解器将忽略 nojac() 算子中的所有内容。也就是说,该算子中的项对雅可比矩阵没有贡献。关于 的残差导数现在简化为:
通过检查我们可以看到,这种简化的导数仅是 为低值时的一个很好的近似。但是求解器不能对所有的
值,都收敛到解。因此,我们通过避免获取某些项的导数(在这种情况下非常小)使问题变得更简单了,但是在某些情况下会使问题无解。
我们考虑一下可以使用 nojac() 算子的其他几种方式。
如果我们将全局方程写为:
R(T) = nojac(T – Q/(1+T^2/100))
那么导数将恰好为零,并且这个问题根本无法求解,因此这种情况并无不有趣。
我们还可以尝试将 nojac() 仅应用于一个项:
R(T) = T – Q/(1+nojac(T)*T/100)
现在,我们的导数是:
\frac{\partial r(T)}
{\partial T}
=1+\frac{TQ}
{100(1+T^2/100)^2}
该导数非常接近于精确的残差,并且至少在这种情况下,即使采用雅可比矩阵公式的这种近似值,求解器将收敛于所有的 值。尽管计算成本没有下降,但这里值得注意的一点是,我们可以将
nojac() 算子应用于残差项的任何子集。
那么,到目前为止我们学到了什么?
nojac() 算子来忽略对雅可比矩阵产生贡献的项但是,在这个小例子中,最后一点并不是很明显。
现在让我们看一个更大的三维模型。我们求解了一个边长为 1cm 的正方体上的传热问题,并在此部分上应用了一个极细 网格,从而我们获得了一个较大的模型;自由度大约为 300 万。

一个用于研究极细网格的简单传热问题的示意图。
我们还将材料特性定义为温度的函数,并使用类似于我们已经看到的材料特性,通过用户自定义的表达式来定义材料的导热系数:
(1+(T[1/K])^2/100)[W/m/K]
可以直接在物理场接口中完成此操作,如下截图所示。

手动将导热系数定义为温度的函数。
当我们使用所有默认设置解决此问题时,该模型将需要用阻尼牛顿法进行四次迭代来求解。整个过程需要大约 135s 的计算时间,并且在一台典型的台式计算机上使用超过 12GB 的内存。在求解过程中,我们还会在日志中收到一条消息,内容为:
找到非对称矩阵。
该消息是材料属性中与温度相关项的结果。也就是说,材料属性中的非线性项使雅可比矩阵不对称,因此该模型将需要更多的内存来求解。现在让我们将整个材料属性表达式包裹在 nojac() 算子中:
nojac(1+(T[1/K])^2/100)[W/m/K]
重新运行该模型,我们看到该模型仍会收敛,需要大约 10GB 内存求解,但现在需要五次默认阻尼牛顿法迭代。也就是说,内存需求下降了,但是收敛的迭代次数却增加了。最有趣的是,执行求解时间为 125s,比以前少了一点!为什么会这样?求解器需要更多的迭代来收敛,但是每次迭代花费的时间更少,因为雅可比矩阵是对称的,需要处理的数据更少。
因此,在这种情况下,尽管需要更多的迭代才能收敛到解,但使用 nojac() 算子既可以减少运行求解时间,又可以减少所需的内存!还要注意,因为使用更新的材料特性表达式,仍然可以正确评估材料特性本身,所以我们能够收敛于相同的解,
再看最后一个示例:如下图所示,压碎包含可压缩气体的薄壁容器。可以使用结构力学模块中可用的壳公式进行建模。

装有可压缩气体并施加有外部压碎载荷的薄壁容器。
通过利用对称性,我们可以将模型缩减为完整模型的1/8。我们施加近似于压碎的分布载荷,以及代表内部可压缩气体的压力载荷。为了表示可压缩气体,类似于在充气超弹性密封条压缩示例中所做的,我们使用了计算变形容器体积的方法。也就是说,通过使用积分耦合算子,我们在容器的整个表面上施加均匀的压力载荷,并且该压力是基于整个容器的变形来计算的。
这种非局部耦合的作用是,容器每个部分的变形都会影响压力,而压力会影响到各处的变形,因此我们的雅可比矩阵变得非常密集。使用默认的极细网格设置求解此问题时,该模型将花费大约 12GB 的内存和 400s 的时间来求解此具有约 22000 个自由度的模型。

屏幕截图显示了压碎容器模型中修改后的压力。
但是,通过简单的将 nojac() 算子包裹到我们所施加的压力上,我们就可以忽略非局部耦合,从而降低内存需求和求解时间。这样,我们只需要 3GB 的内存和 10s 即可收敛到相同的解!
默认情况下,COMSOL 软件将始终采用精确的雅可比矩阵,因为这可以提供最大的收敛可能性。通常,我们宁愿牺牲一些时间和内存来获得尽可能可靠的解。但是,我们确实有能力和灵活性来忽略雅可比矩阵中的选定项。如果要使用此功能,我们必须显式修改材料属性,修改基本的控制方程或在模型内编写自己的变量表达式,因此这是一个有点高级的用户功能。
当然,使用此功能将近似于雅可比矩阵,这有时会减慢甚至阻止收敛,因此在这种情况下请不要使用它。但是,如果模型应用 nojac() 算子时确实收敛,收敛于完整雅可比矩阵计算相同的解,并且可能会使用更少的时间和内存,那么在构建复杂的多物理场模型时,这是一个很好的特性。