如何在选择中手动与实体编号一起工作

2014年6月4日

该博客系列的第1部分,我介绍了如何从comsolMultiphysics®仿真软件中导出Model M文件,以了解Comsol应用程序编程接口(API)的结构。模型M文件的一个重要部分是为了设置域,边界等设置属性而进行的选择。使用数字识别这些选择。在这里,我们解释了如何使用Livelink™自动对实体编号进行自动处理为了MATLAB®。

更改几何形状时处理选择

当将大型更改引入模型的几何形状时,跟踪域,边界,边缘或顶点的数字是一个挑战。这些数字用于指定应在何处应用某些设置:

示意图显示编号的域,边界,边缘和顶点

上图的上部显示了一个散热器,在散热器底座上方只有一个鳍。这不是一个非常有效的设计,因此我将添加更多的鳍片,以计算散热器的不同设计的性能。

正如您在图的下部看到的那样,在散热器基地顶部引入第二鳍时,边界的编号发生了变化。自然,作为新引入的鳍片的一部分的边界必须获得与先前设计不同的数字,因为到目前为止,这些边界还不是该模型的一部分。引入新的边界还意味着一些旧数字将会改变。

请注意,即使对于这样的简单2D模型,编号通常也很难预测。对于2D和3D中更复杂的模型,它变得更加复杂。这里使用的示例和代码很容易使用3D模型制作,但是我选择使用2D模型,因为它变得更容易遵循正在发生的事情。

将模型设置应用于边界时,编号变得很重要。下图显示了散热器凉爽侧的边界条件是什么样子:

屏幕截图显示了在热通量设置窗口中应用于散热器的边界条件
边界在右侧的图形窗口中很容易识别。相应的数字在中间的热通量设置窗口中看到(以粉红色盘旋)

模型M文件代码中的选择

让我们看看Model M文件代码中相应的选择的样子:

模型 - 文件代码显示数字选择

第一组是用于进行冷却的上部,第二组代表散热器的热部分。当第二张鳍(或更多,取决于您的建模方案)时,我们通常对要使用哪些选择编号几乎没有任何了解。

有两种不同的方法来跟踪实体数:

  1. 使用Livelink™为了MATLAB®功能以基于其坐标跟踪几何实体
  2. 使用从几何操作中选择以跟踪几何实体

当您引入非常大的更改(例如新对象,例如我们将在此处做)时,方法1通常是最简单的,并且几何实体的数量会更改。此方法使在命令行上的模型上使用位置时,可以轻松地使用模型。

方法2通常需要更多的步骤来设置,但是具有额外的好处,即设置模型后,您可以避免完全使用实体编号。该模型可以通过Livelink™使用为了MATLAB®或直接在ComsolMultiphysics®用户界面(UI)中,轻松。

Note that if you have a model where you don’t add or remove objects and you do not change its topology, then the numbering of the selections in the model will automatically be updated when you change model settings, and, for example, move objects from one location to another.

使用Livelink™基于坐标的选择为了MATLAB®功能

该模型可作为M-File和MPH文件提供。通常,最好的解决方案是将MPH文件用作模型更改的基础。加载MPH文件通常比运行相应的M文件更快。MPH文件当然可以包含无法保存为M文件的一部分的网格和解决方案,这使得绘制模型结果变得容易得多。

我们使用此命令加载模型:型号= mphload('heat_param1')

这些简单命令将新的鳍片引入模型:

用于引入新鳍的命令

通过使用此命令来验证该设计:

mphgeom(模型,'geom1','edgelabels','on')

将几何形状绘制在MATLAB®图中。

这会产生散热器图的下部。在此图中,可以从视觉上识别数字,但是我们想自动化该过程,以便我们可以改变鳍片及其设计。如果我们使用该实体数字,如果我们使用该实体数mphselectbox命令。此命令使用一个框选择实体,您必须为其指定两个相对角的坐标。有一个相应的功能称为MphSelectCoords在此示例中,选择圆(或3D中的球体)内的实体,但我们不会使用该功能。

以下是mphselectbox我们必须用于此模型的命令。对于冷却鳍,我们提供一组覆盖整个散热器上部的坐标。这意味着,当我在散热器上添加更多鳍时,这些新的鳍将被矩形覆盖,并且可以使用相同的代码在当时获取选择号。对于散热器的热下部,我必须使用两个呼叫MPHSELECTBOX并进行选择编号的结合。“ Union”是一个标准MATLAB®函数,可以采用集合的结合。还可以使用MATLAB®函数“ setDiff”和“ Intersect”,以便使用选择编号来获得所需的结果。

使用的MphSelectBox的屏幕截图

输出看起来像这样:

输出索引由两个呼叫的MPHSelecbox呼叫产生

现在很容易用正确的数字更新模型设置:

使用正确的数字更新模型设置

模拟

选择选择后,很容易调整鳍片的数量。以下脚本显示了如何设置一个简单的循环,该循环将在模型和求解中添加四个鳍片(一一)(一个)。目的是找到在散热器上添加更多鳍的效果。

第一行用于从MPH文件中加载模型。这样,我们不必运行M文件,这通常比加载MPH文件更长。

在for循环中,将更多的鳍添加到适当的尺寸和位置的模型中。使用MphSelectBox检索了选择号,并求解了模型。分析完成后,我们生成每个结果的图。

设置循环以添加鳍的脚本

该方法“ Uniquetag”用于获得新的鳍(矩形)的标签。当我们使用Uniquetag时,我们不必猜测已经采用了哪些标签以及可能可用的标签。这种用作“ r”为参数将返回由“ r”和可用数字组成的标签的使用。

我们学到了什么

当我们更改模型中的几何形状(尤其是在引入新拓扑时)时,重要的是跟踪指定模型设置的实体编号。在模型M文件或MATLAB®命令行中进行此操作的一种有效方法是使用包装器函数,mphselectboxMphSelectCoords,基于实体坐标的返回实体号。

接下来

与M-Files系列合作的下一篇博客文章将讨论如何使用几何操作中的选择来设置模型。这导致了使用Livelink™易于处理的模型为了MATLAB®以及ComsolMultiphysics®用户界面中的内部。使用此方法意味着我们直接与选择对象合作,在许多情况下,可以避免完全使用实体编号。

本系列的其他帖子

  1. 与M型档案合作的最佳实践
  2. 自动处理comsolMultiphysics®中的选择

MATLAB是Mathworks,Inc。的注册商标。


评论(9)

发表评论
乐动体育app
加载...
AlainGlière
AlainGlière
2016年1月21日

嗨,拉尔斯,

我想使用几何参数创建选择框。代替 :
coordbox = [-300E-6 300E-6;-300E-6 300E-6;0.49E-6 0.51E-6];
idx_ftri1 = mphselectbox(型号,'geom1',坐标框,“边界”);

我想这样的事情:
coordbox = ['-wsi/2''wsi/2';’ - wsi/2''wsi/2’;‘0.99*hge’‘1.01*hge’];

但是它行不通。我还尝试了细胞而没有成功。

提前致谢,

AlainGlière

拉尔斯·格雷格森(Lars Gregersen)
拉尔斯·格雷格森(Lars Gregersen)
2016年1月21日

嗨,阿兰

MATLAB在Comsol模型中定义的参数并非自动知道。

如果您想在MATLAB中评估表达式,则必须使用可以计算表达式值的功能mphevaluate(如果需要的话,包括单位)。

Georgios Yiannakou
Georgios Yiannakou
2016年2月9日

您好,我有一个具有720个边界部分的几何形状,我想指定每个磁通量的不同值(我使用MFNC物理接口)。有什么方法可以做到,还是可以自定义边界名称?谢谢。

Ehsan Aalaei
Ehsan Aalaei
2019年5月14日

嗨,拉尔斯·格雷格森

就我而言,当两行(或它们的几个点)在同一框中时,这种方法显然是没有用的。您对这个问题有任何建议吗?
one solution which comes into my mind was measuring the length of lines and get the desired line with specific length ( It’s possible using “if-condition” and measure function), but those two lines which are in the same box may be identical in length!

拉尔斯·格雷格森(Lars Gregersen)
拉尔斯·格雷格森(Lars Gregersen)
2019年5月14日

嗨,埃桑
我不太确定您拥有的东西和寻找什么。我将您解释为:您有2个顶点(在一个框中),您希望获得它们之间的边缘的实体数。也许您可以使用此示例:
Mphopen Busbar
mphgeom(模型,”,“ vertexlabels”,“ on”)
idx1 = mphgetadj(型号,','edge','point',2)
idx2 = mphgetadj(型号,','edge','point',4)
idx_edge = InterSect(IDX1,IDX2)

如果您不知道要点的索引,而是知道坐标,则应使用mphSelectCoords。

这都应该是提取必要索引并使用MATLAB的设置操作的问题。

Ehsan Aalaei
Ehsan Aalaei
2019年5月14日

感谢Lars的考虑

在fact, I have the coordinates (and definitely their entity numbers) of two specific points (for instance the point 1 and 2) then, I’m gonna find the entity number of that edge which is made by those points (it might be a curve or even more complicated edge)

由于这个问题,我不想使用“ mphselectbox”或“ mphselectcoords”。

根据我创建的示意图
想象一下2D,您有两行和3分
(((((((line1:介于point1和point2之间
然后,您可以使用“ mphselectbox”以及“ Point1”和“ Point2” ***的坐标创建一个框,以获取“ Line1” **的实体数。(实际上,“ line1”的实体数量是我们的目标)

正如您在本示意图中看到的那样,“ mphselectbox”功能的结果是实体编号
“ line1”和“ line2” !!!!!!!!!!!!
因为“ point3”在此框中(最小的盒子包含“ Point1”和“ Point2”)

(Point1)————(Point3)
|\ |
|\ |
|\ |(LINE2)
|(line1)\ |
|\ |
|\ |
|\ |
| _ __ _ _ _ _ _ _ __(Point2)

我有一个复杂的几何形状,在3D中有许多点和边缘,我将使用每个边缘的起点和终点获取每个边缘的实体号。

Ehsan Aalaei
Ehsan Aalaei
2019年5月14日

(Point1)————(Point3)
| ~~~~ \ ~~~~~~ |
| ~~~~~~ \ ~~~~~ |
| ~~~~~~~ \ ~~~~ |(LINE2)
| ~~~(line1)\ ~~~ |
| ~~~~~~~~~~ \ ~~ |
| _ __ _ _ _ _ _ _ __(Point2)

拉尔斯·格雷格森(Lars Gregersen)
拉尔斯·格雷格森(Lars Gregersen)
2019年5月15日

谢谢你的精美图纸
您可以使用Mphgetadj,如上示例所示。如果您希望获得很多边缘,则最好使用Comsol API的功能GetStartend和GetAdj。

Ehsan Aalaei
Ehsan Aalaei
2019年5月16日

谢谢你,拉斯
有用!!!
“ getstartend”返回第一和第二个边缘的开始和结束顶点(它们的ID)
返回矩阵的行。另外,列数表示相关边缘的实体数量。

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