问题描述
此解决方法描述如何从命令行启动 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
)。
COMSOL 尽一切合理的努力验证您在此页面上查看的信息。本页面提供的资源和文档仅供参考,COMSOL 对其有效性不作任何明示或暗示的声明。COMSOL 对所披露数据的准确性不承担任何法律责任。本文档中引用的任何商标均为其各自所有者的财产。有关完整的商标详细信息,请参阅产品手册。