如何使用模型方法来加速 COMSOL® 工作流程

作者 Walter Frei
2017年 6月 22日

您是否每次都会在新模型文件中重复执行相同的建模操作?或者总是需要帮助同事在模型文件中手动添加物理场和特征?若回答为“是”,您可以使用 COMSOL Multiphysics® 软件 5.3 版本中新增的模型方法来大幅加快工作流程。让我们来看看如何实现吧。

在 COMSOL Multiphysics® 中手动创建模型方法

正如有关创建随机几何的博客文章所介绍的,您可以利用录制方法 功能对在 COMSOL Multiphysics 图形用户界面(graphical user interface,简称 GUI)中执行的一系列操作进行记录,随后通过重放此方法便可重复进行相同的操作步骤。当然,如果我们已经创建了模型文件,就不需要再使用这项功能了——毕竟我们不想从头再重新录制一遍整个文件。事实上,COMSOL Multiphysics 会自动将模型文件中的所有工作记录保存为 Java® 代码。所以我们可以直接从代码中提取相关的操作,并将它们插入到新的模型方法中。

COMSOL Multiphysics 图形用户界面中突出显示的‘压缩历史记录’选项截图。
压缩历史记录选项。

要从文件中提取全部历史操作记录,您需要执行以下步骤。首先,在文件 菜单中选择压缩历史记录 选项。这是因为 COMSOL Multiphysics 保留了所有命令的历史记录,但我们只需要可生成现有模型的最小命令集。接着,打开文件菜单 > 另存为,并保存为Java 模型文件。现在,您便拥有了一个包含 Java® 代码的文本文件。尝试在文本编辑器中打开生成的文件。文件中开始和结束位置的代码与下列代码相似:

/*example_model.java */
import com.comsol.model.*;
import com.comsol.model.util.*;
public class example_model {
  public static Model run() {
    Model model = ModelUtil.create("Model");
    model.modelPath("C:\\Temp");
    model.label("example_model.mph");
    model.comments("This is an example model");
         ...
         ... /* Lines of code describing the model contents */
         ...
     return model;
 }
 public static void main(String[] args) { run();}
}

上面的这一段代码显示的是可以删除的内容。只有位于 Model model = ModelUtil.create("Model");return model; 之间的代码定义了模型中的所有特征。实际上,我们也可以删除 model.modelPath();model.label(); model.comments(); 这几行。在文本编辑器中删除这些代码行,剩下的就是模型方法中重复模型操作所需的命令。

接下来,创建一个新的空模型文件,切换到“App 开发器”,并创建一个新的模型方法。接着将刚刚编辑的 Java® 文件中的全部代码行复制到新的模型方法中。然后返回“模型开发器”,打开开发工具 选项卡,并选择运行模型方法,即可开始运行代码。运行模型方法意味着重现原始文件中的所有步骤,包括求解模型在内,但是求解模型可能花费很长时间,所以我们常常需要删减模型方法。

放大后的‘App 开发器’模型方法截图。
“App 开发器”中的模型方法。

删减模型方法

我们可以通过两种方式来删减代码。第一种是手动编辑 Java® 代码,删除不需要重新运行的代码。如果您打算这么做,可以参考 COMSOL Programming Reference Manual,因为您可能需要在删除之前知道每一行代码的功能。第二种方法更简单——直接在 COMSOL Multiphysics 的 GUI 中删除特征。将原始模型文件另存为一个新的文件,在新的文件中删除所有不希望出现在方法中的内容,包括几何序列、网格、研究步骤、可视化结果以及其他不需要的内容。

我们来看一个简单的例子。假设您已建立了一个模拟热固化工艺的模型,现在希望将热固化仿真耦合到另一个现有的包含传热仿真的模型中。

我们在介绍模拟热固化工艺的博客中了解到,除了传热之外,模拟热固化工艺还需要三个步骤:

  1. 定义一组材料参数
  2. 添加域常微分方程 接口,以便模拟固化随着时间的演变
  3. 将固化过程中的反应热耦合到热问题中

我们可以在包含以上功能的 GUI 中构建模型,然后输出 Java® 文件。当然,我们仍然需要手动编辑一部分内容。如果您需要学习更多基础知识,可以阅读 Application Programming Guide。不过,只要您熟悉了所有的语法,就会发现 GUI 中的上述三个步骤可以使用下面的模型方法来编写:

model.param().set("H_r", "500[kJ/kg]", "Total Heat of Reaction");
model.param().set("A", "200e3[1/s]", "Frequency Factor");
model.param().set("E_a", "150[kJ/mol]", "Activation Energy");
model.param().set("n", "1.4", "Order of Reaction");
model.component("comp1").physics("ht").create("hsNEW", "HeatSource");
model.component("comp1").physics("ht").feature("hsNEW").selection().all();
model.component("comp1").physics("ht").feature("hsNEW").set("Q0", "-ht.rho*H_r*d(alpha,t)");
model.component("comp1").physics().create("dode", "DomainODE", "geom1");
model.component("comp1").physics("dode").field("dimensionless").field("alpha");
model.component("comp1").physics("dode").field("dimensionless").component(new String[]{"alpha"});
model.component("comp1").physics("dode").prop("Units").set("SourceTermQuantity", "frequency");
model.component("comp1").physics("dode").feature("dode1").set("f", "A*exp(-E_a/R_const/T)*(1-alpha)^n");

该段代码的前四行定义了另外一组新的全局参数。接下来的三行代码将热源 域特征添加到了现有的传热 接口(标记为 ht)、定义了热源项,并将热源应用到了所有域。最后五行建立了一个域常微分方程 接口(此接口默认应用于模型中的所有域),并设置了变量名称、单位以及要求解的方程。

截图显示了如何在 COMSOL Multiphysics 的‘开发工具’选项卡中运行模型方法。
开发工具选项卡中运行模型方法。

我们可以在已经建立了传热分析的模型文件中运行上述模型方法。例如,尝试在 COMSOL Multiphysics “案例库”提供的轴对称瞬态传热教程中添加并运行这一模型方法。然后,重新求解模型来计算出温度和固化的程度。

上方案例的这段代码包含了一些假设:

  • 我们希望模拟模型中所有域的固化过程
  • 模型中已经包含了一个被标记为 comp1 的组件,我们可以在该组件中添加物理场接口
  • 该组件中尚未添加标记为 dode域常微分方程 接口
  • 温度变量被定义为 T,我们可以在域常微分方程 接口中使用它
  • 标记为 ht 的传热物理接口已经存在,我们可以在此接口中添加被标记为 hsNEW 的特征

当然,在开发自己的模型方法时,您需要有能力去解决这些一般的逻辑问题。

关于模型方法的结语

最后,这个简单的示例还说明了,您可以专门创建一个模型方法,把它当作可重复使用的模板来应用到 COMSOL Multiphysics 的任一建模环节中。您也许想要在每一个新创建的文件中运行这个模板模型方法,比如加载一组自定义材料属性、建立复杂的物理场接口或者定义一组复杂的表达式。又或者在现有的文件中重复使用同一个模型方法,由此创建特定的自定义研究类型、修改求解器设置或者定义计算结果可视化,以便重复使用。

熟练掌握这项工作流程的基础知识可以帮助您节省了大量的时间,希望对您有所帮助!

了解模型方法的其他用途

Oracle 和 Java 是 Oracle 和/或其附属公司的注册商标。


评论 (0)

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