许多资深用户可能已经十分熟悉,在使用 COMSOL® 开发多物理场仿真模型和仿真 App 时,可以通过编写代码自动运行模拟过程、为仿真 App 添加功能,以及与外部工具进行集成。在COMSOL Multiphysics® 6.3 版本中,新增的 Chatbot 窗口为用户提供了全新的人机交互功能,可以连接到 OpenAI™ 公司的大语言模型——GPT 模型,帮助用户生成或调试运行 COMSOL® 所需要的代码。这项新功能可以帮助用户通过 AI 工具大幅简化建模和分析过程中的工作。例如,将重复性的任务自动生成循环代码(如 for 循环),或者检测模型方法中的逻辑错误,等等。此外,用户还可以在 Chatbot 窗口中与 AI 进行对话,咨询通用仿真建议。
在这篇文章中,我们将通过几个简单直观的示例来展示如何使用这一新功能为建模过程提供助力。
使用 COMSOL Multiphysics® 软件 Chatbot 窗口中的人机对话功能非常简单,用户无需外部 AI 工具就可以在软件内获取与建模和仿真相关的内容,还可以通过附加方法来检查信息是否存在错误,或运行 AI 模型建议的 API 代码,并在模型开发器和 图形 窗口中查看运行结果。
COMSOL 6.3 版本还新增了一个 Java Shell 窗口功能,用于交互式运行 Java 代码,用户可以在 Java Shell 窗口中运行由 Chatbot 连接的 AI 工具生成的代码。在接下来的示例中,我们将向您演示如何操作。
如果您想进一步了解如何使用 COMSOL API 和 Java Shell 窗口,请查看 COMSOL 官网【学习中心】栏目中的 COMSOL API 概述一文,文中 “在 Java Shell 窗口中运行代码” 部分对此项功能有较为详细的介绍。
Chatbot 窗口适用于 COMSOL Multiphysics® 的 Windows® 版本,包含在 COMSOL 平台产品中,但默认情况通常没有安装。(有关如何安装和设置 Chatbot 窗口的说明,请参阅官网学习中心文章:设置 Chatbot 窗口。)
请注意:
在使用 COMSOL API 时,掌握一些 Java 的基础知识可能会有所帮助。但是,在使用 Chatbot 窗口时,这些知识并不是必需的,因为其中已经包含帮助处理 Java 语法和代码结构的功能。
首先,让我们来看下 Chatbot 窗口如何帮助创建一个圆柱体几何。点击 空模型 按钮,这样就可以使用 API 接口从头开始创建模型的各个方面。
接下来,打开 Chatbot 窗口:在主屏幕选项卡上,转到窗口菜单并选择 Chatbot。
Chatbot 窗口将在桌面环境的右下方区域被打开。
接下来,输入提示语 Create a geometry of a cylinder。
这个提示语将生成创建任意半径和高度的圆柱体的代码,但不会运行代码。如果要运行此段代码,用户需要将它发送到 Java Shell 窗口。
右键单击代码块,选择 发送到 Java Shell。
Java Shell 窗口将打开,并显示相同代码块的副本。
单击 Java Shell 窗口底部的 运行 按钮,将生成圆柱体。
本文显示的示例中,生成了以下代码:
// Create a 3D geometry
model.geom().create("geom", 3);
// Add a cylinder to the geometry
model.geom("geom").feature().create("cyl", "Cylinder");
// Set cylinder properties: radius and height
model.geom("geom").feature("cyl").set("r", 1); // radius
model.geom("geom").feature("cyl").set("h", 5); // height
// Build the geometry
model.geom("geom").run();
不过,请注意,由于 Chatbot 窗口的回应具有一定的随机性,因此每次生成的代码可能会略有不同。
虽然与 Chatbot 功能交互的 AI 模型并不一定全面了解 COMSOL API, 但是通过使用 App 开发器中的 录制代码 或 录制方法 功能,可以引导它生成有用的代码建议。在接下来的示例中,我们将演示如何为模型添加标注,然后在此基础上向 Chatbot 窗口寻求帮助。如果您准备和我们一起开始学习,请从软件案例库中的 COMSOL Multiphysics >电磁 目录下打开“起搏器电极”的教程模型。
如果模型尚未求解,请单击 计算 按钮。此计算需要几秒钟。
接下来,使用软件内置的代码录制功能学习如何添加标注。在功能区中,转到 开发工具 选项卡,然后单击 录制方法 开始录制。
系统会提示您将录制一个名为 method1 的方法,这对于本文示例来说没有问题(当然,您也可以根据需要重命名此方法)。现在,模型开发器将以红色轮廓显示,表明录制正在进行中。
在模型树中,右键单击 三维绘图组 3 并选择 标注。
在 标注 节点的 设置 窗口,在 文本 框中输入 eval(V) ,这将计算并显示电势场的局部值。然后,在 位置 设置中,分别在 x 坐标、y 坐标和 z 坐标输入 0.001, 0.002, 0.003 。
单击 绘制 按钮创建标注。
在 开发工具 选项卡上,单击 停止录制。
接下来,单击 App 开发器按钮,然后双击树中的 method1 节点,在方法编辑器中将显示已录制的代码。
复 制这段代码并切换回模型开发器。
在使用 Chatbot 窗口自动创建 标注 节点之前,您需要删除刚刚生成的 标注 节点,以避免冲突。在模型树中,右键单击 标注 节点并选择 删除 。
接下来,在 Chatbot 窗口中选择 编程 主题选项,然后输入以下指令,并粘贴从方法编辑器中复 制的代码:
This is how you create an annotation in COMSOL Multiphysics:
model.result(“pg3”).create(“ann1”, “Annotation”);
model.result(“pg3”).feature(“ann1”).set(“posxexpr”, 0.001);
model.result(“pg3”).feature(“ann1”).set(“posyexpr”, 0.002);
model.result(“pg3”).feature(“ann1”).set(“poszexpr”, 0.003);
model.result(“pg3”).feature(“ann1”).set(“text”, “eval(V)”);
Can you create a for loop that places these annotations at 10 locations along a line from (x,y,z)=(0,0,-0.02) to (x,y,z)=(0,0,0).
按回车键或点击 提交 按钮。
右键单击已生成代码的区域,然后选择 发送到 Java Shell 。
在 Java Shell 窗口中,单击 运行 以应用标注。
现在,让我们试试更高级的方法。首先删除所有生成的 标注 节点,即按住 Shift 键选择多个节点,然后右键单击并从上下文菜单中选择 删除。
转到 Chatbot 窗口并输入提示语:
Instead, create annotations in a helix pattern centered along the same line with helix radius 0.0025.
单击 提交 按钮或按 Enter 键。
接下来,重复之前的步骤。右键单击生成的代码,将其发送到 Java Shell 窗口,然后单击 运行 ,以绘制标注。
接下来,我们来增加标注内容的密度。首先,删除已创建的 10 个标注节点。然后,在 Chatbot 窗口中使用以下提示语:
Now, make the frequency twice as high and create 20 annotations.
再次右键单击生成的代码并将其发送到 Java Shell 窗口,将显示如下内容。
单击 运行,像之前一样绘制标注。
通过上述示例,您已经深入了解了如何在 COMSOL 中使用 Chatbot 功能快速解决复杂的自动化任务。通过结合使用 录制方法(或 录制代码)和 Chatbot 窗口提示语,您可以引导 Chatbot 做出响应,从而快速增加代码的复杂性。对于需要重复使用相同代码的情况,可以在方法编辑器中的方法中输入代码,而无需使用 Java Shell 窗口。另外请注意,我们也可以记录删除 标注 节点的操作过程,并将这部分流程自动化。
Chatbot 功能的另一个用途是查找代码中的细微错误,而不仅仅是简单的语法错误。为了说明这一点,我们以案例库中 COMSOL Multiphysics > App 下的 “音叉” 模型为例(此案例不需要任何附加产品)。
转到 App 开发器,在 方法 分支中双击 setMaterial 。
要查找语法错误,可以单击 方法 选项卡上的 检查语法 按钮。该功能不使用 Chatbot 窗口,而是编译器级别的检查;通过内置的 Java 编译器,方法编辑器会在离开窗口或保存 App 或模型时自动编译方法。
要查找代码中与语法无关的错误,Chatbot 窗口可以提供帮助。
让我们在代码中引入一个错误来演示如何使用这一功能。在方法 setMaterial 中,用 mat3 替换材料 mat4 的引用。现在,当用户选择标记为 mat4 的铁材料时,程序将改为使用标记为 mat3 的铜材料属性。
现在,该方法中的代码已附加到 Chatbot 窗口,并带有预定义提示语:I need help finding potential bugs in setMaterial, ignoring any code style issues (注意,发送至 Chatbot 子菜单中的其他两个选项,即 关于 setMaterial 的对话 和 对 setMaterial 的改进建议,有不同的预定义提示语。)
按回车键或点击提交按钮。
Chatbot 窗口会发现错误,并输出以下信息:
**Duplicate Material Selection for Copper and Iron:**
– Both “copper” and “iron” are setting the selection for `mat3`. This might be intentional, but if different materials are expected, this is a bug.
它还指出了其他两个潜在问题。不过,在这种情况下,这些都是误报,因为 Chatbot 窗口并没有获得关于该 App 的其他方法和功能的所有信息。
在这种情况下,即使没有 Chatbot 窗口的帮助,这个错误也相对容易被发现。但试想一下,如果该 App 支持的不只是 5 种材料, 而是 40 或 50 种材料,对于这种情况,当处理较长的代码块时,使用 Chatbot 窗口可以大大加快代码调试过程。
您还可以在 Chatbot 窗口中询问建模技巧。假设我们是静电仿真领域的新手,想知道对于此类模型而言,哪些边界条件更为重要。为此,可以在 Chatbot 窗口中选择 建模 主题选项,并输入提示语:
Which are some of the most important boundary conditions for electrostatics?
Chatbot 窗口给出了很好的答案。不过,请注意它提到了“混合边界条件”类型。虽然 COMSOL® 软件中提供了这种边界条件,但需要 AC/DC 模块,并且有一个不同的名称:分布电容。
您还可以使用 Chatbot 窗口查找建模设置中的简单错误。虽然 Chatbot 功能并不了解建模和仿真的所有方面,但它仍然可以提供帮助。例如,它可以识别模型开发器中使用的表达式中的错别字。
要试用此功能,请从案例库中 COMSOL Multiphysics > 传热 下打开“硅晶片激光加热”教程模型。该模型演示了激光在硅晶片上移动的瞬态仿真,不需要任何附加产品。
现在,让我们人为地在一个变量定义中引入一个错别字。定义焦点距离的表达式正确的写法是:
sqrt((x-x_focus)^2+(y-y_focus)^2)
我们将把它改成下面这个错误的表达式,其中第二项错误地使用了x_focus 而不是 y_focus:
sqrt((x-x_focus)^2+(y-x_focus)^2)
然后,从 文件 菜单中选择 另存为,并选择 Java 模型文件(.java) 选项来保存文件。
这将创建一个扩展名为 .java 的文本文件,可以被编译成 Java .class 文件,用作独立的 Java 组件。这种方法无需使用 COMSOL Desktop® 用户界面即可运行 COMSOL Multiphysics® 。 Java 文件通过 API 代码包含整个模型设置。但在本例中,我们将仅使用该文件来识别模型设置中的潜在问题。(请注意,使用此功能与使用 COMSOL Compiler™ 编译 App 无关。)
在任意文本编辑器中打开 .java 文件,复 制代码并粘贴到 Chatbot 窗口,使用类似以下的提示语:
Can you find any errors in this model:
事实上,Chatbot 窗口指出的第一个问题就是我们刚才引入的那个错别字。它指出 :
Here are a few potential issues in the provided code:
1. **Duplicate Variable Definition**: The variable `r_focus` is defined twice with different expressions. The first definition is correct:
“`java
model.component(“comp1”).variable(“var1”).set(“r_focus”, “sqrt((x-x_focus)^2+(y-y_focus)^2)”);
“`
The second definition at the end of the method seems incorrect:
“`java
model.component(“comp1”).variable(“var1”).set(“r_focus”, “sqrt((x-x_focus)^2+(y-x_focus)^2)”);
“`
Ensure you use the correct expression for `r_focus`.
这种调试对于发现模型设置中的小错误非常有用。对于更复杂的模型,在将模型保存为 .java 文件之前,您可能需要删除冗余并简化代码(即压缩历史记录),使文件只包含当前的模型设置(文件 > 压缩历史记录)。