平台: 所有平台 版本: 所有版本

问题描述

此解决方法描述如何从命令行启动 COMSOL Multiphysics® 中的参数化扫描、批处理扫描或集群扫描仿真。

解决方法

概述

模型方法作为一个概念提出,可用于修改参数化扫描批处理扫描集群扫描节点,通过从文件读取参数实例等方式可以实现这些操作。-mode desktop 选项可用于从命令行运行“批处理扫描”和“集群扫描”节点,并在输出文件中获取同步的解和累积探针表。

框架

COMSOL Multiphysics® 提供了各种可能性,支持您在顺序和分布式模式下控制和运行参数扫描:

参数化扫描

COMSOL Multiphysics® 中的参数化扫描特征用于在单个 COMSOL Multiphysics® 实例中运行具有多个参数实例的参数化研究。通常,软件会依次处理这些参数实例,并使用指派给单个 COMSOL Multiphysics® 实例的所有计算资源(进程和内核)。参数化扫描节点控制相应参数化研究的参数范围。您可以从 GUI 或命令行运行该研究,例如,通过指定标志 -std 作为 COMSOL 批处理调用的选项可以实现这一点。研究中的解可以作为解序列中的参数值提供(如果使用“参数化求解器”),也可以在参数化解节点下提供(如果使用外部扫描,其中“作业配置”下包含附加的“参数化扫描”节点;见下图)。

模型方法

请观看在 COMSOL Multiphysics® 中执行参数化扫描研究页面中的视频,获取如何设置“参数化扫描”的操作说明。

分布式参数化扫描

如果参数化扫描研究在分布式内存并行环境中运行,

  • 在研究中作为“参数化扫描”节点与集群计算节点结合使用;
  • 在分布式 GUI 实例中,例如通过 comsol -nn 4 -nnhost 4 启动(在这种情况下不需要“集群计算”节点);
  • 或者在调度程序的提交脚本启动的集群作业中,

那么,您可以使用“参数化扫描”的“研究扩展”栏中的分布式参数化扫描选项(或“稳态”研究步骤的分布参数化求解器选项)。启用此选项后,系统会将“参数化扫描”的参数实例分布到正在运行的计算进程中。例如,在两个节点上运行四个参数实例时,每个节点将处理两个参数实例,并且这两个节点同时完成自己的工作。输出文件(来自批处理运行)或 GUI(用于交互分布式 COMSOL 实例)中可提供所有参数的参数化解。

批处理扫描

批处理扫描参数化扫描相反,前者使用多个 COMSOL 批处理实例来处理参数实例。这些实例作为外部批处理作业从 GUI 中运行的“批处理扫描”研究中启动。这些作业相互独立运行,如果一个作业失败,其他作业及其结果不会受到影响。结果存储在相应的输出文件中。此外,“批处理扫描”节点的“批处理设置”栏中还提供同步解同步累积探针表的选项。通过“同步解”选项,模型 GUI 中将显示所有作业的参数化解,供您进行后处理。

模型方法

“批处理扫描”可以将使用的内核数自动调整到最优值,但您也可以手动设置作业资源。如果外部作业应该仅使用一部分可用内核,您可以设置每个作业的内核数(可以在“作业配置”下的“批处理”节点上设置;见下图)和并发作业数(可以在“批处理扫描”节点上设置)。这两个值的乘积不应超过可用的内核数。

模型方法

有关“批处理扫描”的附加信息,请阅读博客强大的批处理扫描功能

集群扫描

集群扫描不仅提供与“批处理扫描”相同的功能,还提供用于集群计算设置以及远程和云访问的接口。您可以配置外部作业,用于在集群环境中进行分布式执行。此外,“集群扫描”节点的“批处理设置”栏中还提供同步解同步累积探针表选项。博客文章如何使用 COMSOL Multiphysics® 中的集群扫描节点描述了“集群扫描”节点的用法和配置。

模型方法

注:需要“网络浮动许可证”(FNL) 才能在分布式内存并行模式下运行 COMSOL Multiphysics®。这适用于包含集群计算节点(用于分布式“参数化扫描”)的研究、包含集群扫描节点的研究或具有分布式“参数化扫描”的分布式 GUI 实例等(请参见在集群上并行运行 COMSOL®,获取集群执行模式的描述)。

从命令行运行参数化扫描

您可以从命令行运行包含“参数化扫描”节点的研究,例如,通过调用以下命令实现

comsol batch -inputfile mymodel.mph -outputfile out.mph -study std1

对于分布式“参数化扫描”,例如,可通过启动以下命令实现

comsol batch -nn 4 -nnhost 4 -inputfile mymodel.mph -outputfile out.mph -study std1

在这两种情况下,“参数化扫描”都按原样运行;也就是说,使用模型的“参数化扫描”节点中存储的参数值运行。

如果您想要从命令行指定扫描的参数集,可以改为在模型文件中禁用“参数化扫描”节点,并使用标志 -pname-plist 通过命令行输入来设置参数,或者使用 -paramfile 标志从文件读取参数。如果您使用这些命令行方法,则软件会为每个参数实例生成不同的输出文件,并且解不会同步到一个文件。

案例库中提供一个使用“参数化扫描”的示例 App 音叉。该模型确定音叉的基本共振频率,其中的叉齿长度 L 在参数化扫描中是变化的。您可以针对给定的参数范围从命令行调用此模型(在 GUI 中禁用“参数化扫描”),例如通过调用

comsol batch -inputfile tuning_fork.mph -outputfile tuning_fork_out.mph \
-pname L -plist 8[cm],10[cm],12[cm]

从而扫描参数 L=8[cm]10[cm]12[cm](为每个参数生成一个输出文件)。对于空格分隔的参数文件 paramfile.dat,其中第一行包含参数名称,其余行包含对应的参数值元组,例如 L 0.08 0.10

则参数文件控制的参数扫描的调用可能类似如下

comsol batch -inputfile tuning_fork.mph -outputfile tuning_fork_out.mph \
-paramfile paramfile.dat

通过模型方法控制参数化扫描

从命令行控制“参数化扫描”的另一种方法是使用模型方法从输入文件中读取所需的参数。在以下示例中,模型方法读取输入文件并提取参数名称、参数值和参数单位。提取的值用于设置“参数化扫描”节点上的相应属性。最后,通过运行“作业配置”下的“参数化扫描”子节点(假设之前已通过在 GUI 中运行研究创建了此节点)来完成“参数化扫描”。以下示例代码可用于在“App 开发器”中定义新的模型方法:

// Load the csv parameter file with format
// pname0, pname1, ...
// punit0, punit1, ...
// pval00, pval10, ...
// pval01, pval11, ...
// ...,  ...,  ...
String thisStudy = "std1";
String thisFeature = "param"; // Parametric Sweep (*) 
String thisParam = "p1";
String fileName = "C:\\models\\pfile.csv";
String[][] pArr = readCSVFile(fileName);
int rows = pArr.length;
int cols = pArr[0].length;
String pNames = "";
String pUnits = "";
String[] pValues = new String[cols];

// Read names from line 0
pNames = pArr[0][0];
for (int col = 1; col < cols; col++)
  pNames = pNames+","+pArr[0][col];
// Read units from line 1
pUnits = pArr[1][0];
for (int col = 1; col < cols; col++)
  pUnits = pUnits+","+pArr[1][col];
// Read values from lines 2,3,...
for (int col = 0; col < cols; col++)
  pValues[col] = pArr[2][col];
for (int row = 3; row < rows; row++)
  for (int col = 0; col < cols; col++)
    pValues[col] = pValues[col]+","+pArr[row][col];

// Set parameters for thisStudy / thisFeature
with(model.study(thisStudy).feature(thisFeature));
  set("plistarr", new int[]{});
  set("plistarr", pValues);
  set("pname", new String[]{});
  set("pname", pNames);
  set("punit", new String[]{});
  set("punit", pUnits);
endwith();

// Run param sweep
model.batch(thisParam).run(); // (**)

模型方法

请参见如何使用模型方法来加速 COMSOL 工作流程,获取模型方法的简介。在模型开发器中,您可以选择开发工具选项卡中的添加方法调用,在全局定义节点下添加一个方法调用来调用之前定义的模型方法。您可以通过右键单击 Modelmethod1 节点并选择 运行 来测试该模型方法。

模型开发器

参数文件 pfile.csv 是一个逗号分隔的文本文件,其中第一行包含参数名称 (L),第二行包含参数单位列 (cm),第三行至第 n 行包含此参数列的参数值 (8, 10)。 L cm 8 10

基于此配置,通过调用该模型方法可以从命令行运行“参数化扫描”

comsol batch -inputfile tuning_fork.mph -outputfile tuning_fork_out.mph \
-methodcall methodcall1

该方法包含附加标志 -methodcall methodcall1。扫描的参数是模型方法加载的参数文件中定义的参数。如果您想要为不同的参数文件运行多个扫描,可以修改模型方法以加载多个参数文件,然后在一行中运行多个扫描,您也可以定义多个模型方法,从命令行连续运行时调用这些方法。当参数文件包含多个列(需要在研究中定义参数)时,软件会自动设置并使用参数的嵌套循环。

如果“参数化扫描”使用参数化求解器(见下图),则模型方法需要运行相应的求解器序列,也就是说,行 () 需要替换为 ... model.sol("sol1").runAll(); // Parametric solver ()

模型方法

注:Windows® 操作系统支持“App 开发器”。

从命令行运行批处理扫描或集群扫描

如果研究中包含批处理扫描集群扫描,并且您从命令行以批处理模式运行该研究,则默认情况下,软件会忽略“批处理扫描”和“集群扫描”节点。如果您仍希望运行这些节点(也就是说,如果希望允许批处理启动外部进程),则必须在批处理调用中添加标志 -mode desktop,在 Windows 上使用:

comsolbatch.exe -mode desktop -inputfile tuning_fork.mph -outputfile tuning_fork_out.mph

在 Linux 或 MacOS 上使用

comsol batch -mode desktop -inputfile tuning_fork.mph -outputfile tuning_fork_out.mph

(在 5.3a 版本中,您必须在 Linux / MacOS 上使用 -batch off,而不是 -mode desktop)。

在这两种情况下,“批处理扫描”或“集群扫描”都按原样运行,即,扫描模型文件中定义的参数。如果同步解同步累积探针表选项处于选中状态,则同步操作的执行方式与从 GUI 运行的方式相同。这种命令行方法的一大优点是,支持您从所有外部作业中获取包含同步解的输出文件,供进一步后处理。

如果您想要通过所提供模型方法的变体读取的参数文件来传递“批处理扫描”或“集群扫描”的参数,则需要修改上面示例中的行 (),并定义以下命令,对于“批处理扫描”: ... String thisFeature = "batsw"; // Batch Sweep () ...

对于“集群扫描”: ... String thisFeature = "clusw"; // Cluster Sweep (*) ...

此外,行 (**) 需要替换为以下行

...
String thisBatch = "b1";    // for Batch / Cluster Sweep (**)
model.batch(thisBatch).feature("daDef").feature().remove("pr1");
model.batch(thisBatch).feature("daDef").feature().remove("pr2");
model.batch(thisParam).run();
model.batch(thisBatch).feature("daDef").run();

其中假设 GUI 中已运行相应的研究,并且“作业配置”下已生成“参数化扫描”节点 p1 和“批处理”节点 b1。此外,还假设在生成新的外部进程节点之前要移除两个旧的外部进程节点。

要启动由模型方法控制的“批处理扫描”或“集群扫描”,您必须调用以下命令,在 Windows 上为:

comsolbatch.exe -mode desktop -inputfile tuning_fork.mph -outputfile tuning_fork_out.mph \
-methodcall methodcall1

在 Linux 或 MacOS 上为:

comsol batch -mode desktop -inputfile tuning_fork.mph -outputfile tuning_fork_out.mph \
-methodcall methodcall1

(在 5.3a 版本中使用 -batch off,而不是 -mode desktop)。