用Excel®和VisualBasic®构建ComsolMultiphysics®型号

2017年3月15日

您是否曾经考虑过基于Excel®电子表格软件数据的ComsolMultiphysics®软件中的自定义或构建模型?Excel电子表格用于在许多科学和工程应用程序中介绍,协作和存储数据。使用Microsoft®VisualBasic®进行应用程序和Livelink™为了Excel®,我们可以在Excel®电子表格软件中构建和控制模型设置和参数。在此博客文章中,我们说明了此过程并介绍了一些示例。

使用Livelink™为了excel®与Microsoft®VisualBasic®应用程序

Livelink™为了Excel®是一种接口产品,使您可以将Excel数据连接到COMSOL多物理模拟。如果您是Livelink™的新用户为了Excel®,您可以通过阅读以下文档(安装软件后访问)开始开始:

  • Livelink™简介为了Excel®
  • Livelink™为了Excel®用户指南

Excel®电子表格软件还提供了从Excel工作簿内定义和运行VBA(用于应用程序的Microsoft®VisualBasic®)的功能。尽管我们可以手动编写VBA脚本,但也可以使用Comsol Multiphysics用户界面从现有模型中生成它们。正如我们将在一些示例的帮助下看到的那样,很容易实施使用Livelink™的VBA使用为了Excel®。我们将研究一个常见的应用程序,以检索和更新comsol多物理模型中的参数。

尽管此功能很有用,但VBA和Livelink™为了Excel®可用于更多。例如,我们将看到如何构建COMSOL多物理模型,并使用Excel Workbook中插入的一些基本形状来定义模型几何形状。

注意:此处讨论的示例已在2010年Excel®版本中显示,但是其他版本中的过程相同。

使用VBA,可以连接组件对象模型(COM)组件。当Livelink™为了Excel®已安装,还安装了COM接口组件,该组件可用于与ComsolMultiphysics®接口。在comsol多物理服务器和comsol多物理模型之间接口的两个基本com对象是:

comsolcom.comsolutil comsolcom.modelutil

通过使用comsolcom.comsolutil,可以启动comsol多物理服务器,连接并断开服务器的连接。和comsolcom.modelutil,我们可以与Comsol多物理模型进行交互。

使用VBA编辑器

我们可以在Excel®电子表格软件安装的编辑器的帮助下在Excel工作簿中编写和编辑VBA脚本。可以以几种不同的方式访问编辑窗口。例如,如果我们右键单击Excel工作表选项卡,请显示编辑器并选择查看代码。如果我们创建或编辑宏,也将显示编辑器。也有可能启用开发人员在Excel®电子表格软件中的工具栏中,该选项卡中包含用于访问编辑器和其他开发相关功能的按钮。

excel中的一张纸的屏幕截图。

访问VBA中的COM组件

我们可以创建动态实例comsolcom.comsolutilcomsolcom.modelutilVBA中的对象,并发表以下声明。

comsolutil = createObject(“ comsolcom.comsolutil”modelutil = createObject(“ comsolcom.modelutil”

屏幕截图显示如何访问VBA中的COM组件。

该声明的优势是版本独立性。最新的安装版本的comsolcom.comsolutilcomsolcom.modelutil在运行时使用。

也可以声明comsolcom.comsolutilcomsolcom.modelutil使用静态com参考

暗淡comsolutil作为comsolutilcomsolutil = createObject(“ comsolcom.comsolutil”暗淡Modelutil作为Modelutilmodelutil = createObject(“ comsolcom.modelutil”

屏幕截图显示了访问VBA中COM组件的另一种方法。

使用此声明的一个优点是,使用定义类型时,VBA将提供帮助。

屏幕截图在VBA中显示针对已定义类型的帮助选项。

为了能够定义静态类型comsolutilModelutil,我们必须添加一个com参考comsolcom。我们可以通过在Excel®电子表格软件中打开VBA编辑器来做到这一点,然后选择工具菜单,选择参考和选择comsolcom对于已安装版本。

屏幕截图演示了如何添加COM参考。

启动comsol多物理服务器,与VBA连接并断开连接

以下简短的VBA脚本说明了如何启动comsol多物理服务器,连接到启动服务器,然后与服务器断开连接。电话呼叫comsolutil.timeouthandle(true)应用一个超时处理程序,该执行程序告诉Excel®电子表格软件等待长期运行的命令返回。

comsolutil = createObject(“ comsolcom.comsolutil”modelutil = createObject(“ comsolcom.modelutil”称呼comsolutil.timeouthandler(真的称呼comsolutil.startcomsolserver(真的称呼modelutil.connect称呼modelutil.disconnect

Visual Basic的屏幕截图,展示了如何启动comsol多物理服务器。

从comsol API迁移,用于Java®和应用方法

如果您有comsol API的经验,可以与Java®一起使用或在应用程序方法中编写代码,则有一个很好的语法差异。例如,在检索模型特征列表时,语法对于模型中的研究相似。因此,对于在模型中检索研究,以下语法有效:

model.study()

但是,当访问特定研究时,语法是不同的。例如,在使用研究标签检索研究时STD1与comsol API一起用于Java®或应用中的代码,该语法模型。研究(“ std1”)作品。但是,使用VBA®和Livelink™为了Excel®,必须使用以下语法:

model.get_study(“ std1”

comsolMultiphysics®模型中的接口参数

VBA和Livelink™的常见应用为了Excel®将在ComsolMultiphysics®模型中检索和更新参数。在这里,我们将看到这可以实现多么容易。

以下VBA脚本启动了Comsol多物理服务器,连接到启动服务器,加载使用Livelink™在母线中的电气加热为了Excel®与ActiveExcel®工作簿相同目录的模型,使用更新的长度参数求解模型,并使用另一个文件名保存更新的模型。

VBA脚本启动并连接到COMSOL多物理服务器。

以下VBA脚本在模型中提取参数数据,并将其插入Excel工作簿中。

VBA脚本用于提取COMSOL多物理模型参数数据并将其添加到Excel中。

如何使用Excel®和VisualBasic®构建ComsolMultiphysics®型号

在下一个示例中,我们创建一个comsol多物理模型,并使用固体中的传热界面。该过程涉及通过添加带有某些说明的文本框,外部温度边界,内部温度边界和一个用于求解模拟的按钮来定义Excel®电子表格软件中的几何形状。解决模型时,将在Excel®工作簿中插入结果图。让我们详细介绍这些步骤。

1.首先,我们创建一个带有教学文本的文本框,然后将其插入Excel工作簿中。

将文本框插入Excel工作簿中。

2.然后,我们为模拟定义一个区域。我们选择一个自由形状的形状并将其插入Excel®工作簿中。然后,我们选择模拟区作为形状的名称。我们通过右键单击形状并选择的多边形编辑编辑多边形。然后,我们编辑如下所示的形状。

在Excel工作簿中编辑多边形。

3.我们创建一个内部边界,温度更高。为此,我们使用椭圆形的形状,创建一个圆圈,然后将其插入自由形式。我们选择热源作为形状的名称。椭圆形必须位于模拟区形状。

在Excel工作簿中的多边形中创建内部边界。

4.然后,我们添加一个文本框形状解决用作按钮。我们右键单击按钮,选择分配宏,创建一个名为的新宏SOLVE_CLICK

5.接下来,我们在VBA®编辑器中打开分配的宏,然后用以下脚本替换内容:

选项显式solve_click()暗淡节点暗淡坐标暗淡指数暗淡newpolygontable()作为双重暗淡NewHeatSource(12)作为双重暗淡模型作为modelimpl newheatSource(1)= sheet(“ Sheet1”)。形状(“热源”).drawingObject.Left +(sheets(“ Sheet1”)。形状(“热源”).drawingObject.width / 2)newHeatSource(2)= sheet(“ Sheet1”).application.height-(床单“ Sheet1”)。形状(“热源”).drawingObject.top +(表“ Sheet1”)。形状(“热源”).drawingObject.Height / 2))暗淡nnodes只要nnodes = sheet(“ Sheet1”)。形状(“模拟区”).nodes.countRedim保存newpolygontable(1nnodes,12)每个节点床单(“ Sheet1”)。形状(“模拟区”“ Sheet1”).application.height-坐标(1,2)下一个model = setModel(newPolygontable,newHeatSource)称呼model.get_study(“ std1”)。跑步如果不containstag(model.result()。tags(),“ PG1”然后称呼model.result()。创建(“ PG1”,,,,“ plotgroup2d”称呼model.get_result(“ PG1”).feature()。创建(“ Surf1”,,,,“表面”称呼model.get_result(“ PG1”)。标签(“温度(HT)”称呼model.get_result(“ PG1”)。放(“数据”,,,,“ dset1”称呼model.get_result(“ PG1”).get_feature(“ Surf1”)。标签(“表面”称呼model.get_result(“ PG1”).get_feature(“ Surf1”)。放(“可融合”,,,,“热门”称呼model.get_result(“ PG1”).get_feature(“ Surf1”)。放(“数据”,,,,“父母”称呼model.get_result(“ PG1”).get_feature(“ Surf1”)。跑步万一称呼model.get_result(“ PG1”)。跑步称呼范围(“ J10”)。选择暗淡temppng作为字符串temppng =环境(“临时”)&“ \ polygonheat”&格式(现在(),“ yyyymmddhhmmss”)&“ .png”暗淡导出塔作为字符串exportTag = model.result()。export.uniquetag(“出口”称呼model.result()。export()。创建(exporttag,“ image2d”称呼model.Result()。get_export(exporttag).set(“绘图组”,,,,“ PG1”称呼model.Result()。get_export(exporttag).set(“ pngfilename”,temppng)称呼model.result()。get_export(exporttag).lun如果dir(temppng)“”然后称呼application.activesheet.pictures.insert(temppng)setAttr temppng,vbnormal Kill temppng万一称呼model.Result()。export()。删除(exporttag)结束子私人功能setModel(Byrefnewpolygontable()作为双重,,,,ByrefNewHeatSource()作为双重作为变体暗淡comsolutil作为comsolutilcomsolutil = createObject(“ comsolcom.comsolutil”暗淡Modelutil作为Modelutilmodelutil = createObject(“ comsolcom.modelutil”暗淡模型作为ModelImpl如果不IS联机(Modelutil)然后称呼Connectserver(Comsolutil,Modelutil)万一如果不containstag(modelutil.tags(),“ polygonheatModel”然后setModel = createModel(modelutil,“ polygonheatModel”,newpolygontable,newheatSource)退出功能万一model = modelutil.model(“ polygonheatModel”称呼model.get_geom(“ geom1”).get_feature(“ pol1”)。放(“桌子”,newpolygontable)称呼model.get_geom(“ geom1”).get_feature(“ C1”)。放(“X”,newheatSource(1))称呼model.get_geom(“ geom1”).get_feature(“ C1”)。放(“ Y”,NewheatSource(2))称呼model.get_geom(“ geom1”setModel =模型结束功能私人功能createModel(ByrefModelutil作为Modelutil,Byrefmodeltag作为字符串,,,,Byrefnewpolygontable()作为双重,,,,ByrefNewHeatSource()作为双重作为变体暗淡模型作为ModelImplmodel = modelutil.create(modeltag)称呼model.modelnode()。创建(“ comp1”称呼model.geom()。创建(“ geom1”,2)称呼model.mesh()。创建(“ mesh1”,,,,“ geom1”称呼model.get_geom(“ geom1”)。创造(“ pol1”,,,,“多边形”称呼model.get_geom(“ geom1”).get_feature(“ pol1”)。放(“来源”,,,,“桌子”称呼model.get_geom(“ geom1”).get_feature(“ pol1”)。放(“桌子”,newpolygontable)称呼model.get_geom(“ geom1”).selection()。创建(“ CSEL1”,,,,“累积选择”称呼model.get_geom(“ geom1”).get_feature(“ pol1”)。放(“贡献”,,,,“ CSEL1”称呼model.get_geom(“ geom1”).get_run(“ pol1”称呼model.get_geom(“ geom1”)。创造(“ C1”,,,,“圆圈”称呼model.get_geom(“ geom1”).get_feature(“ C1”)。放(“ R”,0.01)称呼model.get_geom(“ geom1”).get_feature(“ C1”)。放(“X”,newheatSource(1))称呼model.get_geom(“ geom1”).get_feature(“ C1”)。放(“ Y”,NewheatSource(2))称呼model.get_geom(“ geom1”).selection()。创建(“ CSEL2”,,,,“累积选择”称呼model.get_geom(“ geom1”).get_feature(“ C1”)。放(“贡献”,,,,“ CSEL2”称呼model.get_geom(“ geom1”)。跑步称呼model.get_geom(“ geom1”).get_run(“鳍”称呼model.material()。创建(“ Mat1”,,,,“常见的”,,,,“ comp1”称呼model.get_material(“ Mat1”)。放(“家庭”,,,,“铜”称呼model.get_material(“ Mat1”).get_propertygroup(“ def”)。放(“热容量”,,,,“ 385 [j/(kg*k)]””称呼model.get_material(“ Mat1”).get_propertygroup(“ def”)。放(“密度”,,,,“ 8960 [kg/m^3]”称呼model.get_material(“ Mat1”).get_propertygroup(“ def”)。放(“导热系数”,,,,“ 400 [w/(m*k)]”称呼model.physics()。创建(“H T”,,,,“传播热量”,,,,“ geom1”称呼model.get_physics(“H T”)。创造(“ temp1”,,,,“温度刺激”,1)称呼model.get_physics(“H T”)。创造(“ temp2”,,,,“温度刺激”,1)称呼model.get_physics(“H T”).get_feature(“ temp2”)。放(“ T0”,,,,“ 293.15 [K] +20”称呼model.get_physics(“H T”).get_feature(“ temp1”).selection()。命名(“ geom1_csel1_bnd”称呼model.get_physics(“H T”).get_feature(“ temp2”).selection()。命名(“ geom1_csel2_bnd”称呼model.study()。创建(“ std1”称呼model.get_study(“ std1”)。创造(“ Stat”,,,,“固定”称呼model.get_study(“ std1”)。跑步称呼model.result()。创建(“ PG1”,,,,“ plotgroup2d”称呼model.get_result(“ PG1”)。标签(“温度(HT)”称呼model.get_result(“ PG1”)。放(”数据”,,,,“ dset1”称呼model.get_result(“ PG1”).feature()。创建(“ Surf1”,,,,“表面”称呼model.get_result(“ PG1”).get_feature(“ Surf1”)。标签(“表面”称呼model.get_result(“ PG1”).get_feature(“ Surf1”)。放(“可融合”,,,,“热门”称呼model.get_result(“ PG1”).get_feature(“ Surf1”)。放(“数据”,,,,“父母”createModel =模型结束功能私人功能ISSOMENTECTER(modelutil作为模型)作为布尔人'尝试访问模型标签。如果未连接到服务器,这将引发错误。关于错误的gotoErrorHandler称呼modelutil.tags issonnected =真的退出功能errorhandler:ISCONNEDED =错误的结束功能私人功能Connectserver(comsolutil作为comsolutil,Modelutil作为模型)关于错误的gotoErrorHandler称呼modelutil.connect如果不comsolutil.isgraphicsserver()然后msgbox提示:=“运行的Comsol多物理服务器不是图形服务器。导出结果将无效。”,按钮:= vbokonly,标题:=“ comsol”万一退出功能ermorhandler:称呼comsolutil.timeouthandler(真的称呼comsolutil.startcomsolserver(真的称呼modelutil.connect结束功能私人功能containstag(tags()作为字符串, 标签作为字符串作为布尔人containstag =错误的如果(UBOUND(过滤器(Tags,Tag))> -1)然后containstag =真的万一结束功能

6.输入代码后,我们单击解决按钮。这将执行宏中定义的VBA脚本,并根据Excel工作簿中的形状创建模型。求解模型,并将图形插入工作表中。

comsol多物理模型插入了Excel工作表中。

如果是模拟区形状已更改,热源形状被移至另一个位置模拟区,模型和结果将有所不同。

很容易想象我们如何根据Excel工作簿中的其他形状,图表和数据来控制和编程此模型。例如,也可以从Comsol多物理模型中提取数值结果,并生成Excel Workbook内容,例如用于报告目的。

这篇博客文章只是使用VBA和Excel®电子表格软件可以做什么。作为用户,您可以访问整个COMSOL API,该API可以访问所有模型设置和参数。这使您有可能定义任何类型的模型,并在使用COMSOL多物理学求解后提取数据。

Microsoft,Excel和Visual Basic是美国和/或其他国家的Microsoft Corporation的注册商标或商标。

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


评论(0)

发表评论
乐动体育app
加载...
探索comsol乐动体育赛事播报博客