如今新产品的研发周期越来越短,为了在市场竞争中抢占先机,研发工程师和科学家们需要一件高效的工具,来帮助他们最快地获取计算结果,并摆脱重复性的例行工作。COMSOL Multiphysics® 正是他们需要的!COMSOL 软件拥有参数化扫描等多种内置功能,可帮助用户提高仿真工作效率。除了能够实现图形建模之外,它还拥有应用编程接口(Application Programming Interface,简称 API)。借助 API,用户便能对任意重复的建模步骤实现自动化操作。下面我们来了解一下 COMSOL API for use with Java®。
COMSOL API 简介
COMSOL API 是一个软件接口,它包含了所有用于定义 COMSOL 模型的算法和数据结构。您每一次在 COMSOL Desktop® 上建立模型,其实就是在同后台的 COMSOL API 进行交互。之前的一篇博客文章专门探讨了 LiveLink™forMATLAB®,该接口在运行时也使用了 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 的简要介绍,您需要的全部相关信息都包含在其中。当然,实际操作会涉及到更多具体细节,借助 COMSOL Desktop 生成的参考代码和 COMSOL API for use with Java® 的参考文档,您便可以掌握所有的细节。
应用案例:创建螺线管电感器的几何结构
为了更具体地演示 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 是甲骨文公司和/或其子公司的注册商标。
评论 (8)
民 张
2021-05-18你好,请问可以直接运行在java脚本程序中直接运行jmetal包吗?
Lei Cao
2021-05-19 COMSOL 员工民 张, 您好!
感谢您的评论。
此博客主要说明如何通过 COMSOL API 实现自动化建模流程,关注的还是 COMSOL 物理模型的建模。若您的 Java 脚本程序中包含其他算法包需与 COMSOL 联合使用,可自行尝试。
如果有进一步问题,建议您联系COMSOL的技术支持团队:
在线支持中心:www.denkrieger.com/support
Email:support@comsol.com
谢谢!
贞捷 唐
2024-02-02comsol api 除了java语言外,有没有用于微软的.net语言的版本?
Lei Cao
2024-02-20 COMSOL 员工贞捷 唐, 您好!
感谢您的评论。
COMSOL API 目前仅支持 JAVA 语言。
如果有进一步问题,建议您联系COMSOL的技术支持团队:
在线支持中心:www.denkrieger.com/support
Email:support@comsol.com
谢谢!
qingjun peng
2024-07-28如果在java脚本程序运行还需要安装一个COMSOL吗?是不是导入“D:\Program Files (x86)\COMSOL60\Multiphysics\apiplugins”那些库文件即可?
王 刚
2024-07-29 COMSOL 员工如果希望直接使用 JAVA API 来建立模型,需要调用 plugins 里面的库文件,而且在运行过程中会检测许可证,所以还是需要安装一个 COMSOL Multiphysics。说明:plugins 里面的库文件还包含安装好的相关模块的库文件,apiplugins 只包含其中最基本的库文件。
昭 张
2024-07-30我尝试在IDEA中运行导出的java文件,绑定依赖后运行到 Model model = ModelUtil.create(“Model”)时;报以下错误:
Exception in thread “main” java.lang.UnsatisfiedLinkError: com.comsol.nativejni.util.FlLicense.initWS0(Lcom/comsol/nativejni/CPointer;Ljava/lang/String;)V
at com.comsol.nativejni.util.FlLicense.initWS0(Native Method)
at com.comsol.nativejni.util.FlLicense.(SourceFile:72)
at com.comsol.nativejni.util.FlLicense.getInstance(SourceFile:167)
at com.comsol.nativeutil.e.c.(SourceFile:22)
at com.comsol.nativeutil.e.b.l(SourceFile:658)
at com.comsol.model.util.ServerModelUtil.create(SourceFile:43)
at com.comsol.model.util.ModelUtil.create(SourceFile:92)
at Main.run(Main.java:11)
at Main.main(Main.java:171)
我再手动载入comsol_native时,提示没有comsol_native
Lei Cao
2024-07-31 COMSOL 员工昭 张, 您好!
感谢您的评论。
此类错误通常发生在尝试调用方法时无法找到包含这些方法实现的库文件。您可参考帮助文档中设置 Eclipse 开发环境的操作流程,设置您的开发环境。帮助手册 《COMSOL_ProgrammingReferenceManual》中,Introduction-Getting Started-Setting up Eclipse for Compiling and Running a Java File 章节。
如果有进一步问题,建议您联系COMSOL的技术支持团队:
在线支持中心:www.denkrieger.com/support
Email:support@comsol.com
谢谢!