如何使用模型方法加速您的comsol®工作流程

2017年6月22日

您是否曾经发现自己在与之合作的每个新模型文件中一遍又一遍地执行相同的建模操作?还是您与同事一起向您发送模型文件,您必须手动将物理和功能添加到?如果是这样,您可以使用方法将工作流程大大加速您的工作流程,从comsolMultiphysics®软件的5.3版本开始。让我们找出如何。

在ComsolMultiphysics®中手动创建方法

正如我们在以前的博客文章中看到的那样创建随机的几何形状,您可以使用记录方法记录您在Comsol多物理图形用户界面(GUI)中执行的一系列操作的功能,然后重播该方法以重现相同的步骤。当然,如果我们已经创建了该文件,这对我们没有任何好处 - 我们不想回去重新记录整个文件。事实证明,comsol多物理会自动保留您在Model File(Java®代码)中所做的所有操作的历史记录。我们可以直接从此代码中提取相关操作,然后将它们插入一种新方法。

comsol多物理GUI的屏幕截图突出显示了紧凑的历史记录选项。
紧凑的历史选项。

为了提取文件中所有操作的所有历史记录,您需要采取一些步骤。首先,去文件菜单,选择紧凑的历史选项。之所以这样做,是因为Comsol Multiphysics保留了所有命令的历史记录,但是我们只希望用来生成现有模型的最小命令集。接下来,去文件菜单>另存为并保存到Java的型号文件文件类型。现在,您有一个包含Java®代码的文本文件。自己尝试一下,然后在文本编辑器中打开结果文件。该文件在开始和末端总是具有类似于下面所示的代码行:

/* example_model.java*/ import com.comsol.model。*;导入com.com.comsol.model.util。*;public Class示例_MODEL {public static Model Run(){model Model = modelutil.create(“ model”);model.modelpath(“ C:\\ temp”);model.label(“ example_model.mph”);model.comments(“这是示例模型”);... ... / *描述模型内容的代码行 * / ...返回模型;} public static void main(string [] args){run();}}

以上代码段向我们展示了我们可以删除的内容。仅在模型= modelutil.create(“模型”);返回模型;用于定义模型中的所有功能。实际上,我们还可以删除model.modelpath();,,,,model.label();, 和model.comments();线。继续并删除文本编辑器中的所有这些代码行,只剩下您在方法中重现模型所需的命令集。

接下来,打开一个新的空白模型文件,转到应用程序构建器,然后创建一个新方法。将您编辑的Java®文件中的所有行复制到此新方法中。然后,切换回模型构建器,转到开发人员选项卡,然后选择运行模型方法运行此代码。运行此方法将重现原始文件的所有步骤,包括求解模型。解决模型可能需要很长时间,因此我们经常想修剪我们的方法。

应用程序构建器的缩放屏幕截图显示了一种方法。
应用程序构建器中的一种方法。

修剪方法

您可以采用两种方法来修剪代码。首先是手动编辑Java®代码本身,修剪您不想重新运行的任何代码。拥有comsol编程参考手册方便的话,如果您要这样做,因为在删除每行之前,您可能需要知道每行的作用。第二,更简单的方法是直接删除Comsol多物理GUI中的功能。从原始模型文件的副本开始,然后删除您不想在方法中显示的所有内容。您可以删除几何序列,网格,研究步骤,结果可视化以及您不想复制的任何其他内容。

让我们来看看一个快速的例子。假设您已经建立了一个模拟热固化的模型,并且希望将此热固化模拟包括在已经设置的热传递模拟的其他现有型号中。

正如我们在以前的博客文章中看到的那样建模热固化除了传热外,还需要三个步骤:

  1. 定义一组材料参数
  2. 添加一个域ode界面以建模固化随时间的演变
  3. 将反应热量从固化中耦合到热问题

我们可以在GUI中构建一个仅包含这些步骤的模型,然后写出Java®文件。当然,我们仍然需要进行一些手动编辑,并且可以通过申请编程指南获取基础知识。但是,一旦您对所有语法感到满意,您就会发现GUI中的以上三个步骤可以写在此处显示的方法中:

model.param()。set(“ h_r”,“ 500 [kj/kg]”,“反应的总热量”);model.param()。set(“ a”,“” 200E3 [1/s],“频率因子”);model.param()。set(“ e_a”,“ 150 [kj/mol]”,“激活能”);model.param()。set(“ n”,“ 1.4”,“反应顺序”);model.component(“ comp1”)。physics(“ ht”)。创建(“ hsnew”,“ heatsource”);model.component(“ comp1”)。physics(“ ht”)。功能(“ hsnew”)。选择()。all();model.component(“ comp1”)。physics(“ ht”)。功能(“ hsnew”)。set(“ q0”,“ -ht.rho*h_r*h_r*d(alpha,t)”);model.component(“ comp1”)。physics()。创建(“ dode”,“ domainode”,“ geom1”);model.component(“ comp1”)。physics(“ dode”)。字段(“无量纲”)。字段(“ alpha”);model.component(“ comp1”)。physics(“ dode”)。field(“ digenseless”)。组件(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");

该代码段的前四行定义了一组额外的全局参数。接下来的三行添加了热源现有的域功能传播热量接口(带标签H T),定义热源项,然后将热源应用于所有域。最后五行设置了域ode默认情况下应用于模型中所有域的接口,并设置可变名称,单位以及求解方程。

屏幕截图演示了如何从Comsol多物理中的“开发人员”选项卡中运行方法。
开发人员标签。

我们可以在已经设置传热分析的文件中运行上述方法。例如,尝试在轴对称瞬态传热教程,可在Comsol多物理学的应用程序库中找到。然后,只需重新确定模型以求解温度和治疗程度即可。

现在,上述代码段中有一些假设:

  • 我们想在模型中的所有域中建模固化
  • 标签已经有一个组件comp1我们可以添加物理界面
  • 还没有域ode与标签的接口dode在该组件中
  • 温度变量定义为t,我们可以在域ode界面
  • 带有标签的传热物理接口H T已经存在,我们可以添加带有标签的功能HSNEW对此

当然,当您开发自己的方法时,您需要能够识别并解决这些类型的一般逻辑问题。

关于方法的关闭评论

从这个简单的示例中,您还可以看到您可以创建一种用作Comsol多物理学中任何部分的可重复使用模板的方法。您可能需要在创建的每个新文件中运行这样的模板方法,可能会加载在一组自定义材料属性中,设置复杂的物理接口或定义一组复杂的表达式。您可能还需要在现有文件中重复使用相同的方法来设置特定的自定义研究类型,修改求解器设置或定义您计划一遍又一遍地重复使用的结果可视化。

一旦您对此工作流的基础知识感到满意,您会发现自己节省了大量时间,我们希望您能欣赏!

了解使用模型方法的其他方法

Oracle和Java是Oracle和/或其分支机构的注册商标。


评论(3)

发表评论
乐动体育app
加载...
伊瓦尔·凯尔伯格(Ivar Kjelberg)
伊瓦尔·凯尔伯格(Ivar Kjelberg)
2017年7月17日

你好沃尔特

我正在使用上面描述的您的过程,以获取绘图代码的系列(约1000行!),以制作一种方法,以在大文件的第二和第三运行中重新生成相同的图,只有几个差异的参数值,即具有相同的数据集和可变名称。

我注意到,即使经过“紧凑的历史记录”,许多“模型。恢复。(…”)Java线散布在我保存的.java文件中。
是否有任何特定原因,或者我可以重新组合他们(只要“ .greate”父母出现在“孩子”之前)?

沃尔特·弗莱
沃尔特·弗莱
2017年7月17日

你好伊瓦,
是的,当然值得尝试一下。当然,您是正确的,您需要在修改对象之前创建一个对象,是的。
此致,

Ke Wang
Ke Wang
2021年10月2日

感谢您的分享,这非常有用!

探索comsol乐动体育赛事播报博客