如今新产品的研发周期越来越短,为了在市场竞争中抢占先机,研发工程师和科学家们需要一件高效的工具,来帮助他们最快地获取计算结果,并摆脱重复性的例行工作。COMSOL Multiphysics® 正是他们需要的!COMSOL 软件拥有参数化扫描等多种内置功能,可帮助用户提高仿真工作效率。除了能够实现图形建模之外,它还拥有应用编程接口(Application Programming Interface,简称 API)。借助 API,用户便能对任意重复的建模步骤实现自动化操作。下面我们来了解一下 COMSOL API for use with Java®。
COMSOL API 简介COMSOL API 是一个软件接口,它包含了所有用于定义 COMSOL 模型的算法和数据结构。您每一次在 COMSOL Desktop® 上建立模型,其实就是在同后台的 COMSOL API 进行交互。之前的一篇博客文章专门探讨了 LiveLink™ for MATLAB®,该接口在运行时也使用了 COMSOL API,只不过实现途径是交互式而非编译式。我们今天将专门讨论 COMSOL API for use with Java®。
作为代码生成器的 COMSOL Desktop即使您并非专业级的 Java® 编程师,也能轻松使用 COMSOL API。您可以直接从手头的 COMSOL Desktop 工具开始操作。在这一图形建模环境中执行的所有动作都会记录在模型操作历史中。之后您还可以将操作历史导出为 Java 代码,操作方式是在保存模型时将文件类型设为“Java® 模型文件”。这种方法对于您构建程序的基本模块是十分有用的。
Hello World!为了让大家逐步熟悉操作流程,我们从一个简单而著名的程序入手,它就是 COMSOL API 版本的“Hello, World!”程序。
首先在 COMSOL Desktop 中创建一个全部由三维几何构成的模型,接着在几何中添加一个 0.1 米 × 0.2 米 × 0.5 米的长方体,然后将其保存为“Java® 模型文件”,名称改为“HelloWorld.java”。
此时在文本编辑器中打开输出,所得代码如下:
import com.comsol.model.*; import com.comsol.model.util.*;public class HelloWorld { public static void main(String[] args) { run(); } public static Model run() { Model model = ModelUtil.create("Model"); model.modelNode().create("comp1"); model.geom().create("geom1", 3); model.geom("geom1").feature().create("blk1", "Block"); model.geom("geom1").feature("blk1").set("size", new String[]{"0.1", "0.2", "0.5"}); model.geom("geom1").run("fin"); return model; } }前两行代码为指向 COMSOL API 的 import 语句,紧接着是 HelloWorld 的类名定义。按照 JAVA 的编程规范,类名应该和文件名保持一致。
这个类中包含了一个 main() 方法,该方法会转而调用静态的 run() 方法,由此创建并返回 Model 对象。在小型的编程项目中,您可以直接对该方法进行修改,换言之,未必定要使用 Java 语言中面向对象的高级特征。
压缩历史记录功能COMSOL Desktop 中还有一个可与代码生成配合使用的实用功能,那就是“文件”菜单中的“压缩历史记录”。在建立模型时,我们经常需要在后续步骤中删除或者来回移动之前添加的一些特征。这些更改操作都会记录到模型历史中,因此存留了大量多余的步骤。
“压缩历史记录”功能可以清除历史记录,移除重复与删除的条目,根据“模型开发器”的顺序重新调整全部记录。若在导出之前启用此功能,您就能够得到整洁的代码。
那么为什么不在保存 Java® 文件之前自动清除历史记录呢?这是因为有时候历史记录可能是有用的。
假设您正在使用 COMSOL API 开发代码,但突然发现其中一部分代码可以通过 COMSOL Desktop 进行快速创建。于是您便不得不开始修改手中的模型,然后将其保存为 Java 文件。幸运的是,您没有在保存代码之前压缩模型历史,因此顺利地在导出代码的末尾找到了所有更改记录。相比于在完整的模型代码中搜寻分布零散的更改操作,这种方法省去了大量麻烦。
编译并运行 COMSOL API 代码Java® 是编译型语言,这意味所有想要实现的功能都必须在类文件中编写对应的代码。为此您需要一个 Java 编译器,例如甲骨文推出的免费 Java® 开发工具包(JDK)。
安装好 JDK 后,便可以使用
comsolcompile(Linux® 或 Mac® 系统中的comsol compile)
命令,该命令是 COMSOL 软件中的一部分,主要用于编译代码,它能够自动为 Java® 编译器建立通向 COMSOL API 的环境变量。
在编译上文中的示例时,您要用到下方命令
comsolcompile -jdkroot PATH_TO_JDK HelloWorld.java
其中 PATH_TO_JDK 指的是 JDK 的安装目录。需要注意的是,COMSOL API 是基于 Java® 1.5 版本,且上述方法适用于 JDK 1.5 或 1.6 版本。
您还可以使用诸如 Eclipse™ 的集成开发环境(Integrated Development Environment,简称 IDE)。使用 Java 1.5 兼容包创建自己的项目,然后将 COMSOL Multiphysics® 安装目录下“plugins”子目录中的所有 JAR 文件添加至构建路径。
将代码编译成了类文件后,您就可以通过“文件 > 打开”菜单在 COMSOL Desktop 中打开它。如果要对上文的示例进行类似处理,您将会看到带有一个长方体的 Hello World三维几何模型。常规的 COMSOL mph 模型文件也能够取得相同的效果。下一步,我们要做些改变,尝试操作一些普通的模型文件无法胜任的高级功能。
不过,先别急着去修改示例。在这之前,让我们仔细研究一遍上文中 run() 方法代码的结构和含义。
简要介绍 COMSOL API通过“Hello World”示例,我们学会了如何使用 COMSOL API 的核心功能。接下来我们来仔细查看一遍 run() 方法,了解它是如何一步步实现相关功能的。
第一行代码,
Model model = ModelUtil.create("Model");
使用 ModelUtil.create() 创建一个新模型,这一静态方法取名称(字符串 Model)作为变元。 ModelUtil 是一系列实用工具方法的集合,也是 COMSOL API 的小帮手。借助它,您可以加载模型,从零创建新模型,或实现其他各种操作。
ModelUtil.create()
返回了一个 Model 对象。此对象包含了 COMSOL 模型的所有设置,也就是说它涵盖了您通常在 COMSOL Desktop 的“模型开发器”中看到的完整模型树。
下一行代码
model.modelNode().create("comp1");
在模型树中创建了一个新的组件节点。随后,下一行代码中添加了模型组件的关联几何
model.geom().create;("geom1", 3);
第二个变元(数字 3)将组件几何扩展为三维结构。
这里需要注意的是,两个 create() 方法中的第一个变元都是一个“字符串”,即所谓的标记。由于模型内很可能包含许多类型相同的特征,因此为了唯一识别这些特征,我们必须在 model 对象中每一处都使用标记。举例来说,模型中可能存在多个组件,每一个组件对应不同的几何,而且组件几何可能包含了许多类型相同的基本形状,因此物理场设置可能使用了大量类型相同的边界条件。综上所述,为每个项分配一个独一无二的标记是使代码保持清晰整洁的好方法。
只要在“主屏幕”选项卡下的“模型开发器节点标签”菜单中启用“显示名称和标记”或者“显示类型和标记”设置,就可以将任何 COMSOL Multiphysics 模型标记显示在 COMSOL Desktop 中。
在“模型开发器节点标签”设置中启用“显示名称和标记”或“显示类型和标记”选项后,标记就会显示在 COMSOL Desktop “模型开发器”中。
下一行代码,
model.geom("geom1").feature().create("blk1", "Block");;
为第一个几何结构 "geom1" 创建了一个长方体。
您可以清晰地辨认出这一行代码在模型树中的层次。前半段代码 model.geom("geom1") 的操作是将命令和几何结构 "geom1" 关联起来,后半段代码 feature().create("blk1", "Block") 向几何结构添加了一个新特征。这个新特征是一个被标记为 "blk1" 的长方体。想象着您正在操作 COMSOL Desktop,前半段代码表示右键单击 "geom1",后半段表示在弹出的几何菜单中选择“长方体”。
当长方体创建完成后,可通过下一行代码修改它的属性
model.geom("geom1").feature("blk1").set("size", new String[]{"0.1", "0.2", "0.5"});
同样地,前半段代码指定了 "geom1" 的第一个长方体 "blk1",后半段使用 set() 方法修改了长方体的尺寸属性。
后半段代码的第一个变元指定了您想要修改的属性,在本示例是“尺寸”。第二个变元赋予了尺寸属性三个新数值,分别表示长方体的宽、高和长。
请注意,尽管这些属性被设置成了实数,但变元却是以字符数组的形式传递的。这是为什么呢?要记得,您可以在 COMSOL 软件的任意位置输入数学表达式来替代具体数值。就这一点而言,COMSOL API 也不例外,因此这类属性是以字符串的形式传递的。
现在,运行模型返回前的最后一行代码
model.geom("geom1").run("fin");
即可返回新模型。最后一行代码旨在使几何结构成型,这相当于在 COMSOL Desktop 中按下了“全部构建”按钮。
以上就是 COMSOL API 的简要介绍,您需要的全部相关信息都包含在其中。当然,实际操作会涉及到