浅谈DREAM.3D——用于分析三维微结构的数字表示环境

一种算法将数据存储为逗号分隔的值列表,而另一种算法则从空格分隔的值列表中读取值。为了使这些算法能够无缝协同工作,需要修改一个或两个代码部分,或者通常会创建第三个程序来在数据结构之间进行转换。

这种开发方式阻碍了代码的可重用性,并对采用这些代码的更大社区构成了障碍。

DREAM.3D可以使用广泛可用的开源格式存储和处理数据。然而,这仅解决了数据的外部或静态格式的问题。

另一个重要问题是数据的内部表示方式,它会显著影响共享数据的算法的难易程度和信息。DREAM.3D利用可扩展的组织结构来描述数据的维度。

DREAM.3D是一个用于分析三维微结构的数字表示环境。在这个环境中,数字数据以空间分辨的方式表示,其中大多数材料微观结构数据是与离散几何元素相关联的简单信息或属性。这些元素可以是图像中的像素、探针扫描中的点或图形中的线段等。

DREAM.3D技术原理

在计算机中,可以处理和组织所有的数字微观结构数据。可以创建适当尺寸的网格,并将数据放置在描述的网格元素上。例如,原子探针数据集中的原子是与点相关的信息,而电子背散射衍射(EBSD)数据集中跨越边界的错误取向是与表面相关的信息。

因此,每个数据集都有一个关联的网格维度,该维度等于其数据描述的特征的最高维度。 需要注意的是,网格维度可能与数据集的维度不同。例如,原子探针数据集由三维位置(x,y,z)组成,但从微观结构的观点来看,它被视为零维特征。

DREAM.3D使用称为"数据容器"的结构来组织和存储网格数据。DREAM.3D使用四种类型的数据容器,用于不同的可能数据维度(顶点=0D,边=1D,表面=2D,体积=3D)。(图1)说明了不同的数据容器及其所能容纳的数据。

dream3d,dreamc-3

图1

低维几何对象与高维对象绑定,并且给定的数据容器可以存储在低维网格元素上的数据。例如,在三维EBSD数据集中,收集的方向数据通常被视为属于单元格,但相邻单元格之间的方向误差也可以存储在单元格共享的面、边和顶点上。

细胞可以存储它们所属的不同特征的协调数(例如三重线或四重点)。

每种类型的数据容器的示例数据集,包括维也纳从头计算模拟程序包(VASP)输入结构(顶点数据容器)、ParaDis输出结构(边缘数据容器)、合成多晶微结构(表面数据容器)和合成多晶微结构(体积数据容器)。

网格表示了数据位置,对于数据集本身是唯一的。虽然网格可以通过平滑、重新网格化或其他处理步骤进行更改,通常是由数据收集或生成协议/设置定义的。

此外,网格本身不受材料类别的影响,可以存在于任何长度尺度。网格只是所有数据元素的物理位置及其相关属性的表示。

给定材料的微观结构可以被视为由称为"特征"的块构建而成,例如晶粒、纤维、孔隙、磁畴、腐蚀坑、位错、单个原子等。

尽管这些特征在材料的现实世界意义上是非常不同的,但在数字上,它们都是简单的离散网格元素组。将网格元素按用户定义的特征进行分组,赋予数据集一定的独特性。

DREAM.3D利用软件工程技术,通过通用数据结构表示所有特定领域的分组。这被称为软件工程中的"抽象层",使DREAM.3D系统能够发展和适应新的领域。

从计算机的角度来看,将网格元素分配给给定特征的行为是与材料类别和长度尺度无关的。网格元素被简单地标记为属于特定分组/分割协议中的特征。

对于每个分组/分割协议,所有元素都被设置为属于一个且仅属于一个特征。用户可能希望通过多个协议对网格元素进行分组。

例如,网格元素可以按共同方向分组,然后再按共同化学特性分组,如果数据集同时具有方向和化学信息。如果使用多个分组协议,每个网格元素都将具有一个特征ID列表向量,指示它属于哪个特征。

一旦特征被定义,就可以计算其大小、形状等属性,并将其与特征相关联。此外,用户可能希望将特征组合在一起以建立"集合"。集合是用户为某种原因链接在一起的特征组。

类似于每个网格元素具有一个(或多个)特征的ID列表,指示它属于哪些特征,每个特征都有一个(或多个)"集合ID"。例如,一组特征可以链接在一起,因为它们都属于相同的相位,或者它们是最大的10%特征等等。

类似于特征和单个元素,可以计算和存储描述集合的属性,例如尺寸分布、平均特征曲率、方向分布函数(ODF)等。

在所有层面上,从单个网格元素到特征和整体,存储信息的方式必须是动态的。为了成为一个灵活的软件环境,能够处理来自多个来源的数据并处理所有材料类别,DREAM.3D预定义了哪些属性可以与网格元素、特征或整体相关联。

因此,需要使用矩阵式容器来存储这种类型的信息。例如,在EBSD扫描中,每个像素具有欧拉角集、相位ID、空间坐标以及与商业软件索引方法相关的属性。

这些属性在DREAM.3D中被称为"属性向量",并定义它们与像素的关联。这些属性向量在(图2)中表示为列,(图2)的行是所有像素的属性列表,称为"属性数组"。

dream3d,dreamc-3

图2

由于这种容器结构,随着过滤器应用于数据,越来越多的属性生成数组,并且每个属性向量都会增长。

在每个级别(网格元素、特征、整体)上,可能存在属性矩阵。 在元素级别只有一个矩阵存在,因为在该级别没有用户分组,所以只有一个定义或网格实例。

然而,在特征和集合级别,可以共存多个属性矩阵。在属性矩阵中,每个属性向量的大小相同,每个属性数组的大小相同。这是因为过滤器计算属性时,过滤器必须遍历属性矩阵中的所有成员。

HDF5开源库的作用

HDF5(Hierarchical Data Format Version 5)是由"The HDF Group"开发和维护的开源库,它实现了一种旨在灵活、可扩展、高性能和可移植的文件格式。HDF5允许每个应用程序在具有意义的层次结构中组织其数据。

几乎任何类型的数据,从标量值到复杂的数据结构,都可以存储在HDF5文件中。可扩展性是设计时的一个重要考虑因素,HDF5可以处理几乎任意大小或维度的数据对象。该库还被设计为高效地查询、读取和写入数据对象,包括在需要时利用并行I/O。

HDF5最重要的一个方面是其在各种平台和计算操作系统上的可移植性。HDF5支持C、C++、Fortran和Java作为其原生实现;同时许多高级编程语言也直接支持HDF5,包括IDL(交互式数据语言)、MATLAB和Python。

HDF5文件可以被视为"文件中的文件系统"。数据可以存储为数据集(类似于文件)并在组内(类似于文件夹)中排列,这种结构非常适合存储来自DREAM.3D的组织数据。

典型的DREAM.3D文件组织结构(如图3所示)。在文件的最顶层或"根目录"中,存在两个组用于保存处理管道和所有数据集的数据容器。

dream3d,dreamc-3

图3

在处理管道组内,每个过滤器都有一个子组,每个子组内包含每个输入参数的数据集。子组的名称是它们在处理管道中的数字顺序,但属性被存储在组内,列出了过滤器的名称和版本号。

子组内的数据集以输入参数的名称命名,存储了输入参数的值。数据容器的内部组是数据集中每个数据容器的子组。子组的名称是用户为数据容器指定的名称。每个子组内部包含多个组(数量取决于数据容器的维度)。

每个组级别中,都与属性矩阵相关联。例如,如果数据容器是一个顶点数据容器,那么将存在与顶点网格元素属性矩阵相关的一组数据集。

HDF5的结构化布局和DREAM.3D文件为数据集的数据库化提供了潜力。HDF5具备读取整个文件的能力,无需查询数据集和组是否存在,这非常适合确定数据是否满足特定标准,无论是具体的处理路径还是属性数组等。

DREAM.3D的流水线工作流是围绕信号处理的概念设计的。在这个类比中,信号是"原始"数据,而各个算法/程序是DREAM.3D中用于处理信号的过滤器。因此,DREAM.3D将每个独立的程序视为过滤器。

需要注意的是,与典型的信号或图像处理不同,DREAM.3D中的许多过滤器不会更改现有的数据/属性元素、特征或整体,而是创建要存储的新数据/属性。

这种模块化的管道工作流目的是分离数据处理的两个关键方面:算法和操作顺序。在设计管道时,用户只需关注操作顺序,同时使用现有算法集。每个算法都可以被视为可修改或替换的模块,如果它不能生成所需的结果。

在典型的高级编程环境(如MATLAB或IDL)中,用户必须手动输入正确的命令来构建所需的管道/工作流,并确保在执行期间所有数据都可用。很多情况下,遗漏的数据可能导致系统在最坏的情况下崩溃,或者在最好的情况下产生神秘的错误消息。

通过DREAM.3D设计了一种可视化的工作流程设计方法。每个过滤器仍然可以被视为预先打包的子程序,就像在MATLAB或IDL中的函数一样,但在DREAM.3D中,过滤器/子程序的可视化链接更类似于LabVIEW等编程环境。每个过滤器都具备执行前所需的数据的知识。

当每个过滤器被放入管道中时,区域工作流在"预检"步骤中执行,其中每个过滤器动态检查以确保它将具备所需的输入数据(类似于LabVIEW)。如果任何输入不正确或缺少数据,将显示错误消息供用户纠正。

在纠正所有错误后,将允许管道执行。在这方面,DREAM.3D提供了一个非常高级和简单的编程模型,易于学习。(图4)展示了带有包含错误的管道的GUI,以说明该软件。

dream3d,dreamc-3

图4

DREAM.3D的开发重点是降低开发人员在贡献代码时遇到的障碍。DREAM.3D的核心提供了用于数学、输入/输出和内部数据管理的通用库。

此外,DREAM.3D还提供了一个库,用于动态创建过滤器的可视化效果,并提供了相对简单的界面,满足过滤器的需求。这减少了开发人员所需的"低级"计算机科学知识的数量。

此外,可以编译DREAM.3D以构建一个配套程序,该程序将为用户生成所有必要的文件和插件。生成的Shell文件包含了新过滤器所需的所有功能,以及如何向用户添加输入参数调用以及如何请求和添加示例数据到可扩展属性矩阵。

这使开发人员能够专注于他们的算法,同时在一个类似于"在这里放置算法,在这里列出输入要求,在这里列出输出详细信息"的环境中工作。

DREAM.3D技术分析总结

DREAM.3D的未来增长可能还与与其他软件包集成的能力有关。例如,DREAM.3D的开发过程中有意识地没有投入时间和精力来生成可视化包。

相反,建立了一个与ParaView的链接,ParaView是一个由Kitware与能源部合作开发的开源可视化环境。

ParaView是一个功能强大的可视化包,经过多年的开发。通过使用之前讨论过的HDF5文件结构以及XML描述(Xdmf格式),可以在ParaView中打开DREAM.3D文件并查看数据。因此,ParaView的新发展间接地影响了DREAM.3D的开发。

DREAM.3D的主要区别在于节省时间和人力成本。使用可视化表示的工作流程减少了学习曲线,使得DREAM.3D成为适用于所有水平用户的平易近人的软件套件。

DREAM.3D具有用于生成合成数字微结构的过滤器,其输入是统计数据。生成的合成微观结构的可视化结果(如图5所示)。合成生成的微观结构是使用统计数据创建的,其中微观结构中没有双晶特征。

dream3d,dreamc-3

图5

DREAM.3D是一个开源软件包,专注于创建高级编程环境,用于处理、分割、量化、表示和操作数字显微结构数据。DREAM.3D的核心目标是实现将微观结构量化到数字基础的易于使用的软件工具。

DREAM.3D的核心实现了标准化的方法来处理和存储数字微观结构数据。此外,它还包括协议,允许独立开发的过滤器和插件相互连接。

DREAM.3D的环境建立在小型研究小组、政府实验室、初创公司和主要工业公司之间的合作基础上,它们可以共同合作并利用彼此的工作成果。

DREAM.3D将减少进行微观结构表征的时间和成本,因为它能够利用社区内的发展并将分散的研究领域整合到一个共同的开发环境中。

参考文献:

Groeber, Michael A. and Michael A Jackson. “DREAM.3D: A Digital Representation Environment for the Analysis of Microstructure in 3D.” Integrating Materials and Manufacturing Innovation 3 (2014): 1-17.