借助 COMSOL API for use with Java® 实现建模任务的自动化操作

2014年 3月 27日

如今新产品的研发周期越来越短,为了在市场竞争中抢占先机,研发工程师和科学家们需要一件高效的工具,来帮助他们最快地获取计算结果,并摆脱重复性的例行工作。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® 安装目录下“插件”子目录中的所有 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 的简要介绍,您需要的全部相关信息都包含在其中。当然,实际操作会涉及到更多具体细节,借助 COMSOL Desktop 生成的参考代码和 COMSOL API for use with Java® 的参考文档,您便可以掌握所有的细节。

应用案例:创建螺线管电感器的几何结构

为了更具体地演示 COMSOL API 的实际应用,让我们来看看“案例下载”中的螺线管电感器模型

COMSOL API 的案例模型

该模型旨在对特定线圈设计的自感现象进行仿真。仔细观察其几何结构,您会发现它是由一个个长方体搭建起来的。模型中螺线管的尺寸是固定值。设计这一类装置时,我们必须尝试不同的配置,比如多次修改电感器的横截面和线圈匝数等。为实现这一目的,您可以在 COMSOL Desktop 中建立参数化几何。

对横截面进行参数化是一个简单的操作,但是另一方面,由于每三匝导线之间的长度互不相同,因此绕组数目无法在 COMSOL Desktop 中用参数来表示。不过正如上文所述,借助 COMSOL API 就能指定 Java® 项目中长方体的所有参数。您可以利用这一点来自动创建螺线管电感器的几何结构。

在上面的“Hello World”示例中,我们学会了如何创建长方体;为了建立螺线管电感器的几何模型,我们需要创建许多尺寸属性不同、方向相异的长方体,并将它们合理地布置在理想结构中。在编写代码时,您需要追踪下列变量:

变量代码
横截面( wire_width and wire_height)
一段导线长度(piece_length)
位置(pos_x and pos_y)
方向(rotation_angle)
导线间距(inner_spacing and loop_spacing)
匝数(n_loop)

接着生成长方体,使之构成循环的螺线管。

毫无疑问,我们需要为每一个长方体指定一个独特的标记。一种方法是通过将长方体的计数器与 "blk" 一类的基础字符串相关联,然后手动创建。不过,您有更好的选择——COMSOL API 提供的 uniquetag() 方法。此方法不仅能实现同样的效果,还能在内部追踪计数器,保证同一个标记不会使用两次。

下方动画中的每一个长方体标记都是通过如下代码生成的

model.geom("geom1").feature().uniquetag("blk")

借助独一无二的新标记,您便可以创建长方体并设置相关属性了。除了 "size",您还需要更改 "pos""rot" 属性,它们分别用于控制位置和方向。完成设置后,即可更新变量,进入下一次迭代了!


使用 COMSOL API for use with Java® 自动生成螺线管电感器的几何结构。

还能做什么?

除了创建几何结构,COMSOL API 还能完成非常多的操作。事实表明,COMSOL Desktop 能够实现任何常规建模任务的自动化操作。比如在螺线管电感器示例中,可以自动计算出模型更新后的新结果。您还可以在代码中运行参数化扫描,借此对整个螺线管电感器的参数范围进行全面的计算。然后便可以通过创建绘图将计算结果保存为图像文件,并将全部数值保存到文件中。

实际上,本篇博客文章仅仅介绍了 COMSOL API 的基础应用。除了在 COMSOL Desktop 中执行手动编程任务外,COMSOL API 还能让您访问并控制有限元网格、有限元矩阵和求解结果的数据集这一类的数据结构。

COMSOL API 工具不仅可用于编写能在 COMSOL Desktop 中打开的类文件,还能编写出与 COMSOL Server 进程相连接的程序,甚至还能编写集成了 COMSOL 技术的独立程序。总而言之,若您需要长期执行同一个仿真任务,强大灵活的 COMSOL API 工具就能够将让此任务自动进行。

Eclipse 是 Eclipse 基金会的商标。Linux 是 Linux Torvalds 的商标。Mac 是注册在美国和其他国家/地区的苹果公司的商标。MATLAB 是 MathWorks 公司的注册商标。Oracle 和 Java 是甲骨文公司和/或其子公司的注册商标。


评论 (4)

正在加载...
民 张
民 张
2021-05-18

你好,请问可以直接运行在java脚本程序中直接运行jmetal包吗?

Lei Cao
Lei Cao
2021-05-19 COMSOL 员工

民 张, 您好!

感谢您的评论。
此博客主要说明如何通过 COMSOL API 实现自动化建模流程,关注的还是 COMSOL 物理模型的建模。若您的 Java 脚本程序中包含其他算法包需与 COMSOL 联合使用,可自行尝试。
如果有进一步问题,建议您联系COMSOL的技术支持团队:
在线支持中心:cn.comsol.com/support
Email: support@comsol.com
谢谢!

贞捷 唐
贞捷 唐
2024-02-02

comsol api 除了java语言外,有没有用于微软的.net语言的版本?

Lei Cao
Lei Cao
2024-02-20 COMSOL 员工

贞捷 唐, 您好!

感谢您的评论。
COMSOL API 目前仅支持 JAVA 语言。

如果有进一步问题,建议您联系COMSOL的技术支持团队:
在线支持中心:cn.comsol.com/support
Email: support@comsol.com
谢谢!

浏览 COMSOL 博客