本文摘要(由AI生成):
本文介绍了广泛场与密集场的概念,强调了守恒原则在广泛场中的重要性。广泛场和密集场分别代表物理量的广泛性和密集性,其插值公式根据场类型而异。文章还讨论了插值过程中的守恒原则和最大原则,以及它们在网格重叠和非重叠情况下的应用。最后,通过非重叠P0->P0插值的例子,展示了如何根据场的性质选择合适的插值矩阵,以满足守恒或最大原则。本期内容介绍了MED模块的相关概念和基本功能,鼓励读者下载软件尝试。
作为一个开源软件平台,Salome能够用于数值模拟的通用预处理,后处理和工作流管理操作,另外其灵活的架构能够允许包括Code_Saturne, Code_Aster, Open TELEMAC-MASCARET,Syrthes,Paraview等软件的兼容,并能便捷地进行软件间的相互耦合运算和处理。
MED模块简介
在我们平时所做的仿真研究过程中经常需要在算例(包括代码的链接和耦合)以及在后处理中对网格和场进行加工处理。从代码角度来看,这个过程可以被视为访问输入网格和场(具有特定约束)以及参数(数据集)的软件组件,并产生输出网格和场。
MED模块则汇集这些处理项目的操作于一体,它可以使不同的代码之间进行通信,同时尽可能保留代码内容的完整性。因此借助MED,我们可以更方便地操作仿真模拟过程中涉及的各种不同代码。
为了实现其目标,MED模块包括:
1. 处理网格和场以满足代码输入要求;
2. 将场信息提取到后处理计算的代码中;
3. 在代码之间交换网格和场的信息。
使用MED最常见的方法是编写链接到库的专用代码(C 或Python),但也可以使用图形用户界面。此外,MED模块提供多种接口级别,因此,用户可以选择适合其代码的交互级别。
由于MED的处理对象是网格和场,所以我们先对这两个概念做一简单概述,对有限元计算的相关概念已经非常熟悉的读者可以直接跳过这节。
仿真模拟代码的根本意义在于在给定的几何域上求解给定的方程组。这个几何域可以大到表示一座建筑物,也可以小到在一小块混凝土中的分子网络。
然而,数字代码通常无法直接使用这种格式,因此必须将该几何域的空间离散化,也就是网格划分。因此,网格可以粗略地视为连续输入几何的离散版本。SALOME中的SMESH模块通常专门用于执行此操作。
网格由单元格(基本空间单元)构成,其通常是简单的多边形或多面体。
在网格的支持上,代码可以以场的形式读取或存储数据。因此,场是一个数据阵列,其中每个单元(或节点等)具有与其相关联的一个(或多个)值。例如,模拟传热方程的代码将产生温度场,该温度场将单个温度值分配给网格的每个单元。
在有限元领域的词汇中,数值被存储在单元格的场通常称为P0场,而存储在节点的场则被称为P1场。
多年来,数据库和模块一直在发展,导致用于标记各个部分的名称之间出现了一些混淆。所以我们需要简单地区分一下几个概念。当我们提到“MED”时,可以指:
MED文件格式:用于保存网格的文件格式(扩展名为“.med”);
MED文件库:由EdF R&D(并随SALOME提供)开发的C 库,用于读取/写入MED文件;
MEDCoupling:用于处理内存中网格和场的(相对)高级API (应用程序编程接口);
MEDLoader:写入,读取MED文件,比MED文件库API更加用户友好;
Remapper:专用于插值/投影方法的库的一部分;
SALOME的MED模块(GUI中使用):SALOME主应用程序中的图形客户端,提供与库的一部分的图形交互;
最后是ParaMEDMEM,用于并行投影操作和场传输。
下面的示意图表示MED库的各种包的层架构。
网格在MEDCoupling中的表示被定义为:
1. 点云,其中必须指定每个点的显式坐标;
2. 节点连接,为每个单元格指定构成该单元格的点云中的点。
MEDCouplingUMesh类将其节点连接存储到2个阵列中,如下图:
较大的第一个阵列MEDCoupling :: MEDCouplingUMesh :: _ nodal_connectivity;
较小的第二个阵列MEDCoupling :: MEDCouplingUMesh :: _ nodal_connectivity_index。
MED文件格式是HDF5标准的一个特例,并且在MEDCoupling之前就已存在。有关HDF5本身的更多详细信息,请查阅HDF5 Group网站。它侧重于处理大量数据,设计理念是促进并行使用。
MED文件格式的官方文档可在SALOME安装路径中在线获得:
$ {MEDFILE_ROOT_DIR} /share/doc/html/index.html
下图显示了MED文件格式的类似UML的图表。例如,我们看到网格名称是将场链接到其支撑网格的唯一关键词。
下面列出MEDCoupling库的大多数功能。它们都能以Python或C 代码实现,感兴趣的读者可以访问https://docs.salome-platform.org/latest/dev/MEDCoupling/developer/functionalities.html以阅读这些例子的代码。
对场的直接操作:
在没有附加时间的单元格/节点上构建张量场;
在连续且没有时间间隔的单元格上构建矢量场;
获取具有不同时间离散化的场的副本;
创建场的子部分。
局部计算:
用常数/表达式为变量分配值;
对单元格上的场执行加减乘除操作;
矢量或二阶张量的运算。
全局操作:
求空间极值、空间均值、时间极值。
插值:
也是MEDCoupling最重要的功能,将在接下来详细介绍。
其他:
重新编号网格;
在单元格/节点上置换场;
合并非重叠场。
当使用不同的代码或需要耦合代码时,通常情况是初始问题已经以两种不同的方式建模。例如,热力学代码使用了四面体网格,而CFD代码使用了六面体网格,这时就需要采用插值的方式将场数据从一个表示传输到另一个表示。一般来说,这是一项复杂的任务,在许多算例中存在着不同问题(两个网格是否重叠?我们是否希望保留场中所有的数据?等等),而MED库中提供的插值机制可以帮助用户轻松地实现这一操作。
插值(或投影)方法是MEDCoupling库的关键特性,它允许将给定源网格上的场值“转移”到目标网格上另一个新创建的场。两个网格/场不需要具有相同的网格/空间维度,也不需要具有相同的离散化。
插值可以作用的对象涵盖以下空间/网格尺寸:
1. 1D,2D线,2D表面;
2. 3D表面,下图为一示例;
3. 3D体积。
插值通过以下方式执行:
节点定位,例如当节点场被投影到单元场时;
或者通过单元格交集,对于涉及单元格交叉计算的任何给定类型的插值,插值矩阵的计算分两步执行:
过滤过程通过消除边界框不相交的元素对来减少必须执行计算的元素对的数量;
对于所有剩余的元素对,调用适当的单元格。
场的性质:密集场和广泛场
场的性质有助于确定场的某些物理意义并影响插值公式的选择。在MED中,它有五个可能的值,所对应的插值公式的选择将会在后文给出:
1. 默认值“NoNature”不允许使用任何插值工具。
对于密集场:
2. IntensiveMaximum,适用于温度,压力场等密集场,其最大原则优于守恒原则;
3. IntensiveConservation,适用于功率密度场等密集场,守恒原则优于最大原则。
对于广泛场:
4. ExtensiveMaximum,适用于功率场等广泛场,最大原则优于守恒原则;
5. ExtensiveConservation,适用于功率场等广泛场,守恒原则优于最大原则。
密集场指的是代表密集物理量的场,例如密度、功率密度、温度或压力。通常,物理值不会随着基础几何体的大小而缩放。广泛场指的是代表广泛物理量的场,例如质量、体积、动量或功率。通常,物理值相对于基础几何尺寸线性缩放。对于具有P0表示(基于单元格)的场,守恒公式根据场是广泛的还是密集的而不同。
这两个概念本身分为两个子类别。实际上在某些情况下(例如,非重叠网格),在插值时不可能同时满足守恒原理和最大原理。场的性质决定了用于非重叠单元格的公式,从而确定了我们将满足的属性。
对于基于单元格的场(P0场),目标离散化场的分量可以表示为源离散化场的分量的线性组合,以矩阵-矢量表示为:
W称为插值矩阵。插值器的目标是根据场的物理特性(密集/广泛)和它们的网格离散化特性(P0/P1)来计算矩阵W。
在许多CFD数值方案的基础上,物理量如密度,每单位体积的动量或每单位体积的能量遵循一些守恒定律,这些守恒定律应在每个单元的离散水平上保留。
因此,通常希望过程插值在任何域上保持积分恒定。在离散级别,对于任何目标单元格,必须满足以下一般插值公式:
该等式用于基于场类型(P0,P1)以及源和目标网格的几何信息来计算W。
插值过程的另一个重要要求是最大原则:插值产生的场值应保持在原始场的上限和下限之间。当在源网格S和目标网格T之间执行插值时,重叠的部分是很重要的。实际上,如果S的任何单元格被T的单元格完全覆盖,而且T的任何单元格被S的单元格完全覆盖:
那么网格S和T被称为重叠。在这种情况下,下表中给定列中的两个公式给出相同的结果。所有密集特性的公式都会产生相同的输出,所有广泛特性的公式也会产生相同的输出。
理想的插值算法应该是守恒的并且遵循最大值原则。然而,如果两个网格不重叠,则无法设计这样的算法。当网格不重叠时,使用
或
获得一个满足守恒原则或最大原则的算法。
在具有P0表示(基于单元格)的场的情况下以及网格不重叠时,该方案满足守恒原则或最大原则(但不能同时满足)。根据场的性质,插值矩阵采用以下值:
让我们考虑以下情况,有包含两个单元格的源网格和包含一个单元格的目标网格。单元#0上的FS值为4,单元#1上的值为100。这里的目的是根据场的性质通过场FS计算目标网格上的内插场FT。
插值的第一步得出以下M1矩阵:
如果我们应用上面的IntensiveMaximum公式,则会得到以下M矩阵:
正如我们在这里所看到的,最大原则得到了满足。我们建议使用这种特性来插入一个密集的场,如温度或压力场。
如果我们应用上面的ExtensiveMaximum公式,则会得到以下M矩阵:
对于想要仅在源网格的交叉部分(图中的绿色部分)上保存数值的情况,通常建议使用这种类型的插值来插入功率(NOT功率密度!)。在这里处理的特定情况下,意味着目标单元格仅拦截了25.055 W的功率!因此,从源场FS的104 W,仅传输了25.055 W到目标场中。
如果我们应用上面的ExtensiveConservation公式,则会得到以下M矩阵:
对于想要保留其源场中所有功率的情况,通常建议使用这种类型的插值来插入功率(NOT功率密度!)。这里在源场中有104 W,在输出目标插值场中也有104 W。但是,正如我们在这里看到的,这里不尊重最大原则,因为目标单元#0的值高于两个截取的源单元格。
如果我们应用上面的IntensiveConservation公式,则会得到以下M矩阵:
我们特别推荐用这种类型的性质来插入密集的密度场(如慢化剂密度、功率密度等)。与上面结果的差异在于,目标区域在整个目标单元格中均质化。
为了说明这种情况,我们可以考虑FS是一个功率密度场,目标单元#0从源单元#0获取了0.125×4 = 0.5W的功率,并且从源单元#1获取了0.75×100 = 75W的功率。它导致整个目标单元格#0上的功率为75.5W。因此,最终功率密度等于75.5 / 1.5 = 50.333 W /平方米。
本期简单介绍了MED模块的相关概念和基本功能,感兴趣的朋友可以访问远算格物的官方网站下载软件试试手.
期待您的关注