如何在 COMSOL Multiphysics® 中计算几何对象间的距离

作者 Walter Frei

2017年 3月 2日

你是否曾在 COMSOL Multiphysics® 软件中模拟过变形的几何对象,并且想要求出它们之间的距离?在今天的博客文章中,我们将介绍如何利用确定最短距离场的方法计算对象之间的距离,并讨论如何将距离场用作多物理场模型的一部分。

使用“广义拉伸”组件耦合计算距离

我们将两个对象分别标记为 A 和 B,如下所示。我们要计算的三个距离是:

  1. 到对象 A 的距离为距离场。这时,我们计算的是对象 A 周围和内部的所有点,距离 A 边界上最近一点的距离和方向,即 dA
  2. 对象 B 边界上的每个点到对象 A 上最近点的距离,即 dAB
  3. 对象 A 和 B 之间最短线段的端点,即 dAB,min

示意图显示了两个对象以及描述二者间距离的方程。
A 和 B 两个对象以及待计算的距离。

我们可以组合使用 COMSOL Multiphysics 中的“广义拉伸”和“最小值”组件耦合来计算上述所有不同距离。我们先看一看如何使用“广义拉伸”组件耦合。首先,给算子添加名称 A_b,并将其源选择 定义为对象 A 的边界。在高级 一栏中,使用最近点 作为网格搜索方法。相关设置如下,此算子的所有其他设置则可保留默认设置。

示意图显示了‘广义拉伸组件耦合’的设置,目的是计算 COMSOL Multiphysics® 中两个对象之间的距离。
用于计算最近点距离的“广义拉伸”组件耦合的设置。请注意,网格搜索方法被设为 最近点

我们将此算子引入名为 d_A 的变量,变量的定义如下:

sqrt((x-A_b(x))^2+(y-A_b(y))^2)

此变量被定义在待计算距离场的所有域中,在本例中,即对象 A 和 B 周围的域。我们也可以计算该距离场的梯度负值 -\nabla d_A(\mathbf{x})。由此一来,我们获得了指向 A 边界上最近点的向量场的分量。我们可以使用“微分”算子 d(d_A,x) d(d_A,y) 来提取空间导数,如下方截图所示。

截图显示了变量定义。
变量定义。

我们可以将这些变量应用在任意地方,例如绘制距离场,或者使材料属性依赖于距离。下图绘制了距离场的等值线及其方向矢量。请注意,对象 B 后方的区域中的距离也可以进行计算。显而易见,我们获得了大量的信息,但计算成本也相当之高,因为系统计算了周围域中每个点到对象A的最短距离。有时候,我们只需计算出对象之间的距离,并不需要所有信息。

两个对象之间的距离场与最短方向绘图。
两个对象的周围域到对象 A 边界的距离场(等值线)和最短方向(箭头)。

计算对象之间的间隙

下面我们要简化任务,舍弃方向,只计算两个对象之间的距离。我们使用同一个“广义拉伸”组件耦合,但这一次只需在对象 B 的边界上定义一个用于计算距离的变量。

图片显示了定义两个对象之间距离的变量。
定义对象之间距离的变量。

我们使用了同一个距离函数,但是没有对对象A和B周围的区域剖分网格。我们甚至也不必对 A 和 B 域剖分网格;只要在对象边界上创建网格即可。这种方法可以缩短计算时间,不过只能计算对象 A 到对象 B 边界上每一点的最短距离,而无法提取方向矢量。我们还可以反过来,计算从对象 B 到对象 A 边界上每一点的最短距离。在下图中,两种最短距离显示在对象边界中。

两个对象边界上的点之间的最短距离。
对象 B 边界上的每个点到对象 A 上最近点的距离以及正好相反的结果。

使用“最小值”组件耦合计算对象之间的最短线段

接下来,我们继续寻找两个对象之间最短距离的线段。在上一节中,我们计算了描述 A 到 B 及 B 到 A之间最短距离的变量 d_ABd_BA;在这一节中,我们将找出域边界之间的最短距离。为此,我们建立了两个“最小值”组件耦合:一个用于对象 A 的边界,另一个用于对象 B。如下方截图所示,两个算子的名称为 minA minB

截图显示了 COMSOL Multiphysics® 中‘最小值’组件耦合的设置。
对象 A 边界上的 最小值组件耦合的定义。

接着,我们调用“最小值”组件耦合来提取最短距离。我们还可以向“最小值”组件耦合添加第二个变元,借此找到距离最短处的坐标。例如将变量 A_x 的表达式定义为 minA(d_BA,x),可以获取对象 A 边界上 d_BA 最小值对应的 x 坐标。

图片显示了两个域之间最短线段的坐标定义。
两个域之间最短线段的坐标定义。

我们可以在任意地方调用定义上述坐标的变量,例如使用截线 特征来显示连接两个对象的最短线段,如下图所示。如果对两个对象之间的域剖分网格并求解,那么我们可以沿二者间的最短线段来绘制场结果。

左侧为‘截线’特征的设置截图,右侧为两个对象之间的最短距离的绘图。
用于确定对象之间最短线段的 截线 特征。

在 COMSOL Multiphysics® 中计算距离的局限和应用

这些用来确定距离的技术适用于任何模型。虽然本文展示的是二维示例,但它们都能延伸至三维空间。然而,计算三维距离场确实要花费相对较长的时间,而计算边界和间隙之间的距离则计算量相对较少。

在计算非平滑形状周围的距离场时,我们需要考虑得更加细致。在下图中,凹角周围的距离场是非平滑的,因此在与边界的两个不同部分等距的线上,方向矢量均未定义。要解析距离场的非平滑性,必须提高网格的精细度。

四张图片显示了对象周围和内部的距离场结果绘图。
粗化网格(左图)和细化网格(右图)上带凹角对象的周围和内部距离场。在这种情况下,距离场的平滑度取决于网格。

只要我们在适当细化的网格中计算了距离场,就能像对待模型中的任何其他变量一样处理距离场。举例来说,我们可以使材料属性随着与表面间距离的增加而变化。下图显示了一种代表性的材料分布。

示意图显示了一种代表性的材料分布,此分布为与表面间距离的函数。
一种代表性的材料分布,此分布为与表面间距离的函数。

我们还可以使用距离函数来可视化模拟结果。假设我们只需对距离表面一定范围之内的区域进行求解。在这种情况下,我们可使用过滤器 子特征来制作体图,然后输入一个逻辑表达式,使模型仅显示到对象表面一定距离之内的结果,相关示例如下。

左侧为‘过滤器’子特征的设置截图,右侧为表面距离的结果绘图。
使用距离函数仅绘制与表面相距 5 mm 之内的解。

关于在 COMSOL Multiphysics® 中计算对象之间距离的结语

在上文中,我们演示了如何计算模型中到边界的距离场、边界间的距离和两个边界间的最短线段。这种方法也适用于计算三维模型中始于边和点的距离场。计算出的距离值可以应用于模型设置、物理定义和结果计算中的任何地方。我们在上文中分享了数个示例,现在轮到你来动手了。我们十分乐意听到你的想法!

更多资源


评论 (6)

正在加载...
云龙 韩
云龙 韩
2018-03-19

hello
this method can use to

云龙 韩
云龙 韩
2018-03-19

Can this method be used in the model of motion?
thank you

彤 姝
彤 姝
2021-12-17

朋友,我看过你发表的两篇文章还有硕士论文,我看到你实现了这个过程(囊泡膜与壁面保持一定距离0.1微米),我对这个过程很感兴趣,也在摸索这个过程(血管中的流固耦合)。方便留个联系方式吗xlz_0226@163.com,我想请教一个问题。感谢感谢。

Margin Page
Margin Page
2023-09-19

韩云龙前辈,您好!我最近在做电场和流场作用下细胞运动的仿真,也遇到了需要计算几何图形到边界距离的问题,但按照本篇博客设置的“最小值”组件导致了报错,所以想向您请教一下。我的邮箱是13197359366@163.com,希望能得到您的指点

宇航 秦
宇航 秦
2018-03-20

韩云龙您好,

感谢您的关注,有关模型的问题,请发送邮件至support@comsol.com。
谢谢。

秦宇航

惟仁 肖
惟仁 肖
2018-12-06

可以提供此案例文档吗?

浏览 COMSOL 博客