您是否曾经考虑过基于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®电子表格软件中的工具栏中,该选项卡中包含用于访问编辑器和其他开发相关功能的按钮。
访问VBA中的COM组件
我们可以创建动态实例comsolcom.comsolutil
和comsolcom.modelutil
VBA中的对象,并发表以下声明。
放comsolutil = createObject(“ comsolcom.comsolutil”)放modelutil = createObject(“ comsolcom.modelutil”)
该声明的优势是版本独立性。最新的安装版本的comsolcom.comsolutil
和comsolcom.modelutil
在运行时使用。
也可以声明comsolcom.comsolutil
和comsolcom.modelutil
使用静态com参考
暗淡comsolutil作为comsolutil放comsolutil = createObject(“ comsolcom.comsolutil”)暗淡Modelutil作为Modelutil放modelutil = createObject(“ comsolcom.modelutil”)
使用此声明的一个优点是,使用定义类型时,VBA将提供帮助。
为了能够定义静态类型comsolutil
和Modelutil
,我们必须添加一个com参考comsolcom
。我们可以通过在Excel®电子表格软件中打开VBA编辑器来做到这一点,然后选择工具菜单,选择参考和选择comsolcom
对于已安装版本。
启动comsol多物理服务器,与VBA连接并断开连接
以下简短的VBA脚本说明了如何启动comsol多物理服务器,连接到启动服务器,然后与服务器断开连接。电话呼叫comsolutil.timeouthandle(true)
应用一个超时处理程序,该执行程序告诉Excel®电子表格软件等待长期运行的命令返回。
放comsolutil = createObject(“ comsolcom.comsolutil”)放modelutil = createObject(“ comsolcom.modelutil”)称呼comsolutil.timeouthandler(真的)称呼comsolutil.startcomsolserver(真的)称呼modelutil.connect称呼modelutil.disconnect
从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脚本在模型中提取参数数据,并将其插入Excel工作簿中。
如何使用Excel®和VisualBasic®构建ComsolMultiphysics®型号
在下一个示例中,我们创建一个comsol多物理模型,并使用固体中的传热界面。该过程涉及通过添加带有某些说明的文本框,外部温度边界,内部温度边界和一个用于求解模拟的按钮来定义Excel®电子表格软件中的几何形状。解决模型时,将在Excel®工作簿中插入结果图。让我们详细介绍这些步骤。
1.首先,我们创建一个带有教学文本的文本框,然后将其插入Excel工作簿中。
2.然后,我们为模拟定义一个区域。我们选择一个自由形状的形状并将其插入Excel®工作簿中。然后,我们选择模拟区作为形状的名称。我们通过右键单击形状并选择的多边形编辑编辑多边形。然后,我们编辑如下所示的形状。
3.我们创建一个内部边界,温度更高。为此,我们使用椭圆形的形状,创建一个圆圈,然后将其插入自由形式。我们选择热源作为形状的名称。椭圆形必须位于模拟区形状。
4.然后,我们添加一个文本框形状解决用作按钮。我们右键单击按钮,选择分配宏,创建一个名为的新宏SOLVE_CLICK。
5.接下来,我们在VBA®编辑器中打开分配的宏,然后用以下脚本替换内容:
选项显式子solve_click()暗淡节点暗淡坐标暗淡指数暗淡newpolygontable()作为双重暗淡NewHeatSource(1到2)作为双重暗淡模型作为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(1到nnodes,1到2)每个节点在床单(“ 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作为comsolutil放comsolutil = createObject(“ comsolcom.comsolutil”)暗淡Modelutil作为Modelutil放modelutil = 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()作为双重)作为变体暗淡模型作为ModelImpl放model = 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工作簿中的形状创建模型。求解模型,并将图形插入工作表中。
如果是模拟区形状已更改,热源形状被移至另一个位置模拟区,模型和结果将有所不同。
很容易想象我们如何根据Excel工作簿中的其他形状,图表和数据来控制和编程此模型。例如,也可以从Comsol多物理模型中提取数值结果,并生成Excel Workbook内容,例如用于报告目的。
这篇博客文章只是使用VBA和Excel®电子表格软件可以做什么。作为用户,您可以访问整个COMSOL API,该API可以访问所有模型设置和参数。这使您有可能定义任何类型的模型,并在使用COMSOL多物理学求解后提取数据。
Microsoft,Excel和Visual Basic是美国和/或其他国家的Microsoft Corporation的注册商标或商标。
Oracle和Java是Oracle和/或其分支机构的注册商标。
评论(0)