强大的批处理扫描功能

2016年 2月 2日

你是否曾经通宵运行大量的参数化扫描,第二天早上却发现参数化求解器仍在运行?你或许希望先查看已计算好的参数解,同时等着最后几个参数的收敛。批处理扫描 功能是解决上述问题的有效方法,计算好的参数化解会自动保存为文件,便于打开进行可视化及后处理。

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

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

在求解器扫描过程中,许多情况下会希望查看部分结果。例如:

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

如果以上任何一种情况中使用了批处理扫描,那么每个参数都在一个能独立开始和停止的进程中求解。每个参数值经过参数求解后得到的结果都存储为一个 .mph 文件,在求解过程中可以打开任意个这样的文件进行查看。在下面的示例中,你还会了解如何将探针结果保存到文本文件中。

静电传感示例

为了演示批处理扫描,我们采用 COMSOL Multiphysics 基本模块“App 库”中的电传感器示例。这个示例模型介绍了在盒子边界施加电位差后,盒内的情况。其中产生的表面电荷取决于盒内物体的介电常数,用于判断盒内是否存在物体,甚至可以帮助确定物体的形状。电阻抗断层成像采用了一种类似的技术用于医疗诊断,只不过这种技术使用的是交流电。

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

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

初始模型中,物体拉伸到 0.8 米厚。在这个示例中,拉伸距离改为 0.5 米。

参数化扫描的输入数据

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

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

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

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

此模型在“材料”节点下定义了三种材料。“材料 3”表示盒内的星形物体,“材料 2”表示另一个物体。“材料 1”对应盒内物体周围的空气。我们调用了内插表 int1,使用其中的值作为“材料 3”的材料属性定义中星形物体的介电常数。使用语法 int1(sn)。请注意,这里没有考虑单位,因为介电常数没有单位。

星形物体的介电常数。
星形物体的介电常数取自通过参数 sn 进行索引的表。

探测表面电荷

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

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

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

点探针表达式的屏幕截图。
表面电荷的点探针表达式及单位 nC/m^2。

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

更新结果按钮。
探针的 更新结果按钮。

在 COMSOL Multiphysics 中设置批处理扫描

默认情况下不会显示批处理扫描 选项。要启用该选项,在“模型开发器”工具栏的显示 菜单中,选择高级研究选项

显示菜单中的高级研究选项。
在“模型开发器”的“显示”菜单中激活“高级研究选项”。

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

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

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

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

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

控制设置。
控制批处理扫描的设置。

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

下一个设置是存储所有这些文件的目录(此处是 C:\COMSOL)。

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

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

在扫描过程中 一栏有两个选项:同步解同步累积探针表同步解 将存储的所有文件中的结果收集到我们要开始仿真的“主模型”.mph 文件中,最终结果与运行参数化扫描的结果极其相似。我们选择清除这个复选框,因为在这个示例中我们假定只希望查看每个结果。此外,如果扫描的数量过于庞大,则收集全部结果可能要消耗大量的时间和内存。同步累积探针表 保持选中,表示对探针的输出结果进行累积,与完整的求解信息相比,收集这种信息非常轻松。

扫掠后 一栏中,我们勾选输出模型到文件 复选框,这确保了自动保存的 .mph 文件包含解(对应每个参数)。

探针数据保存到文件

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

添加保存的探针表。
手动添加“保存的探针表”。

在“保存的探针表”的设置中,将存储表 设置改为模型和文件中。在本示例中,我们将探针结果保存到 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 Multiphysics 中使用集群计算的更多信息,请阅读我们的有关混合计算的系列博客

在自己的仿真中探索批处理扫描的用法


评论 (0)

正在加载...
浏览 COMSOL 博客