使用应用程序构建器导出网格和解决方案

2016年4月6日

您是否曾经想将COMSOL多物理学的网格和分析数据写入文本文件?您可能需要在将信息传递给另一个软件程序,甚至只是到电子表格中时要这样做。您通常想根据您正在使用的其他工具的需求来自定义编写此类数据的确切格式。使用应用程序构建器非常容易。让我们找出如何!

跨软件平台工作

假设您正在使用COMSOL多物理模型并执行系统的热分析。您正在与一群人一起进行其他类型的分析。您的同事并不像您那样幸运,也不能使用Comsol多物理学,但他们仍然需要访问您的建模结果。幸运的是,您可以快速将分析数据转换为非常特定的文本文件格式,该格式可以通过同事正在使用的软件工具来读取该格式。

Comsol多物理学中具有不同元素类型的热模型。
一个具有不同元素类型的简单comsol多物理热模型。

现在,假设您正在对包含各种不同元素(包括四面体)的模型进行稳态热分析;金字塔;棱柱形;和六面体(砖)类型,如上所示。让我们进一步假设我们将要读取数据的软件工具需要我们使用线性离散化,这意味着我们需要在定义元素角的每个节点(顶点)上写出温度,并使用温度线性插值来计算元素内的温度场。因此,我们需要写出所有顶点位置。这些顶点的温度数据;以及对哪个顶点定义每个元素的描述,以及如何定义。

当然,有许多不同的方式可以编写这种信息。出于当今的博客文章的目的,我们将假设一种简单的逗号限制格式,其通用示例如下所示。

n,1,0.0,0.0,0.0 ... n,1000,10.0,10.0,10.0 d,1,332.0 ... d,1000,343.0 tet,1,2,2,4,6,6,3 ... tet,tet,100、42、43、41、45 Pyr,101、47、48、41、40、44 ... Prism,201、66、67、67、65、72、74、73 ... Hex,301、81、82,83、84、91、92、93、94 ...

让我们看一下这些各行的含义。所有行以文本字符串开始,表示该行上是什么样的信息,逗号将信息界定为各种字段。在第一行,我们有顶点(节点)位置信息:

n,1,0.0,0.0,0.0

之后的第一个领域n字符是节点号,是任意的,第二,第三和第四字段是X- ,,,y-, 和z- 该节点的结合,因此我们的第一个节点在全局起源。在上面的样本中,总共有一千个节点。

接下来,每个节点位置的计算温度数据都写在单独的行上:

D,1,332.0

在那之后的第一个领域d字符是节点号,第二个字段是该节点位置的温度。

其余的行提供了有关元素及其如何定义元素的信息。让我们从查看第一个元素定义开始:

tet,1,2,4,6,3

这条线定义了四面体(tet) 元素。第一个字段是元素号,接下来的四个字段告诉我们哪个节点定义了四面体。在这里,节点2、4、6和3是元素的节点1至4。这些信息也称为元素连接为了理解这一点,让我们看一下我们元素的例证。

四面体元素的示意图。
四面体元件由四个节点定义。

对于我们的四面体元素示例,节点2、4和6是前三个节点。如果我们使用右手规则并按顺序遵循这三个节点,我们将获得一个指向第四节点的方向的向量。节点编号3。所有三维元素类型的元素排序如下所示。。

所有3D元素类型的元素排序。
四种不同类型的3D元素的元素号约定。

现在,我们了解了我们需要将其写入文本文件的数据格式,让我们看看如何使用应用程序构建器来完成此操作。

使用应用程序构建器编写数据

我们从现有的3D模型开始我们的应用程序开发,该模型已经具有已经计算出的稳态温度解决方案,如前所述。要开发该应用程序,请切换到应用程序构建器,我们将在其中定义图形用户界面并在应用程序后面编写数据处理代码。我们的界面将非常简单,只有一个按钮称为方法消息日志这将显示一些信息。该应用程序只能执行一件事:当用户单击按钮时,上述数据格式写入文本文件,并在消息日志中显示了所写内容的摘要。

为仿真应用创建接口。
我们的应用程序有一个按钮(1),该按钮调用方法(2),该按钮将网格和解决方案数据写入文件,并将一些统计信息写入消息日志(3)。

该方法包含所有数据处理代码,如下所示,添加了行号和红色文本字符串。

1 StringBuffer fileb = new StringBuffer();2 double [] [] d_vtx = model.mesh(“ mesh1”).getVertex();3字符串[] [] S_VTX = ToString(d_vtx);4 for(int m = 0; m “ n,”+(M+1)+“,”+s_vtx [0] [M]+“,”+s_vtx [1] [M]+“,”+s_vtx [2] [M]+“ \ n”);6} 7 model.result()。数字()。创建(“ Interp”,,,,“ Interp”).setInterPoLationCoordinates(d_vtx);8 model.result()。数值(“ Interp”)。放(“ expr”,,,,“ T”);9 double [] [] [] [] alldata = model.result()。数值(“ Interp”).getData();10 model.result()。数值()。删除(“ Interp”);11 for(int m = 0; m “ D,”+(M+1)+“,”+alldata [0] [0] [M]+“ \ n”);13} 14 int [] [] EI;15 int numtets = model.mesh(“ mesh1”).getNumelem(“ tet”);16 if(numtets> 0){17 ei = model.mesh(“ mesh1”).getElem(“ tet”);18 for(int m = 0; m “ Tet,”+(M+1)+“,”+(EI [0] [M] +1)+“,”+(EI [1] [M] +1)+“,”+(EI [2] [M] +1)+“,”+(EI [3] [M] +1)+“ \ n”);20} 21} 22 int numpyrs = model.mesh(“ mesh1”).getNumelem(“ Pyr”);23 if(numpyrs> 0){24 ei = model.mesh(“ mesh1”).getElem(“ Pyr”);25 for(int m = 0; m “比尔,”+(m+1+nuntets)+“,”+(EI [0] [M] +1)+“,”+(EI [1] [M] +1)+“,”+(EI [2] [M] +1)+“,”+(EI [3] [M] +1)+“,”+(EI [4] [M] +1)+“ \ n”);27} 28} 29 int numprisms = model.mesh(“ mesh1”).getNumelem(“棱镜”);30 if(数字> 0){31 ei = model.mesh(“ mesh1”).getElem(“棱镜”);32 for(int m = 0; m <数字; m ++){32 fileb.append(“棱镜,”+(m+1+nuntets+numpyrs)+“,”+(EI [0] [M] +1)+“,”+(EI [1] [M] +1)+“,”+(EI [2] [M] +1)+“,”+(EI [3] [M] +1)+“,”+(EI [4] [M] +1)+“,”+(EI [5] [M] +1)+“ \ n”);34} 35} 36 int numHexes = model.mesh(“ mesh1”).getNumelem(“十六进制”);37 if(numhexes> 0){38 ei = model.mesh(“ mesh1”).getElem(“十六进制”);39 for(int m = 0; m “十六进制,”+(m+1+nuntets+numpyrs+数字)+“,”+(EI [0] [M] +1)+“,”+(EI [1] [M] +1)+“,”+(EI [2] [M] +1)+“,”+(EI [3] [M] +1)+“,”+(EI [4] [M] +1)+“,”+(EI [5] [M] +1)+“,”+(EI [6] [M] +1)+“,”+(EI [7] [M] +1)+“ \ n”);41} 42} 43 WriteFile(“用户:///output.txt”,fileb.tostring());44消息(“用户目录中的文件写入file output.txt的数据。”);45消息(s_vtx [0] .length+“节点\ n”+nuntets+“四面体元素\ n”+numpyrs+“金字塔元素\ n”+数字+“棱镜元素\ n”+numhexes+“六面体元素\ n”);

让我们逐条逐行。

  1. 创建一个字符串缓冲区,我们将存储将写入文件的数据。
  2. 从模型中提取所有网格顶点位置,并将数据放入二倍阵列中。
  3. 将网格位置数值数据转换为字符串数据,因为它将写入文本文件。
  4. 启动一个循环,将在所有节点位置上迭代。
  5. 将每个节点的行附加到字符串缓冲区,带有节点索引和xyz- 分泌。
  6. 关闭对节点的前面。
  7. 设置插值功能,以在先前提取的节点点位置提取数据。
  8. 设置表达式以在这些节点点上进行评估。在这种情况下,变量“ t”表示我们正在提取温度。
  9. 使用插值功能,提取所有温度数据。这将存储在3D阵列中。
  10. 删除插值功能,因为不再需要它。
  11. 在所有提取的数据上设置一个前面的循环。由于我们仅提取一个字段(温度),并且假设模型中仅存在一个解决方案集,因此我们只需要在数组的最后一个维度上进行索引即可。
  12. 将数据线附加到字符串缓冲区,该节点号和该节点处的温度值。
  13. 关闭所有输出数据上的前面循环。
  14. 初始化一个存储元素索引数据的空的2D数组。
  15. 从模型中提取四面体元素的数量。
  16. 检查是否有四面体元素要写出。
  17. 从模型中提取四面体元素连接数据。
  18. 在所有四面体元素上设置了一个前面的循环。
  19. 将每个四面体元素的行附加到字符串缓冲区,并带有元素号和节点号。
  20. 关闭所有四面体元素上的环路。
  21. 关闭检查是否有四面体元素的IF statement。

第22至42行只需重复其他元素类型的第15至21行的功能即可。请注意,元素编号是根据所有先前元素编号增加的。同样,在整个方法中,所有节点的索引都会被一个节点增加。这是因为comsol多物理在内部启动所有索引以零启动,但是以我们所需的输出格式开始,我们希望以一个启动所有节点和元素索引。整个字符串缓冲区被转换为字符串,并写入第43行的文件。在第44和45行,将一些信息打印到消息日志。

写出的文件称为output.txt并在用户目录中找到。当您转到软件首选项中,该目录在磁盘上的位置是指文件菜单>首选项>文件>应用程序文件,如下面的屏幕截图所示。您可以根据需要更改目录。

输出文件位置的规范。
输出文件的位置在软件首选项中指定。

因此,我们的方法完成了。在下面的屏幕截图中,我们可以看到我们的应用程序中的应用程序。

设计用于导出网格和解决方案的应用程序。
该应用程序将已写入文件的内容报告。

关于使用应用程序构建器导出数据的关闭评论

我们已经演示了如何创建一个非常简单的应用程序,该应用程序写出网格并由comsol多物理稳态热模拟产生。您可以简单地将数据复制到应用程序中,然后将其粘贴到文本文件或电子表格中。当然,我们可以在此应用中构建更多的复杂性,包括:

  • 编写可能代表与瞬态模拟不同时间或不同时间的多个数据集。
  • 将数据格式化为固定格式文件类型。
  • 写出高阶元素类型和插值方案。
  • 写出矢量数据或元素之间不连续的数据。

当然,我们现在不会立即解决所有这些情况,但是如果您有兴趣将这些修改添加到自己的自定义应用中,这里有一些资源可以使您入门:

寻求有关如何构建特定类型的应用程序或进行其他建模查询的更多信息?联系我们


评论(5)

发表评论
乐动体育app
加载...
Nhan Nguyen
Nhan Nguyen
2016年5月6日

多谢 !一张很棒的纸!

KrisztiánGadó
KrisztiánGadó
2018年3月11日

你好!
非常感谢此GUID!
我有2个问题:
1.我只想出口网格的某些部分,我该怎么做?
2.与时间相关变量呢?
例如:我有一个异步电动机,我想在每个时间步中导出磁通密度,但是只有在定子节点上,我该怎么做?

猫般的Fairclough
猫般的Fairclough
2018年3月29日

嗨,krisztián,

谢谢你的评论!

有关您的问题,请联系我们的支持团队。

在线支持中心://www.dvdachetez.com/support
电子邮件:support@comsol.com

Mervenaz Sahin
Mervenaz Sahin
2020年2月11日

你好,

我们在哪里可以导出下面给出的数据,您在此处提到的数据?
我需要为每个元素节点提取连接矩阵或节点坐标。

谢谢你,

n,1,0.0,0.0,0.0

n,1000,10.0,10.0,10.0
D,1,332.0

D,1000,343.0
tet,1,2,4,6,3

索伦
索伦
2021年9月2日

感谢这个(旧的)博客。
我想知道如何提取二次网眼的所有节点?
如果我将离散化更改为二次化,则节点编号不会改变。

探索comsol乐动体育赛事播报博客