在 Abaqus 中处理复杂仿真时,经常会遇到内置工具无法满足需求的情况。无论是整合先前运行的数据、导入外部数据集,还是保存仿真结果以供进一步分析——这时就需要用到 Abaqus 了。 UEXTERNALDB 子程序 闪耀。.
在本完整指南中,我们将详细介绍您需要了解的有关这个强大的用户子程序的一切:它的功能、它的重要性以及如何掌握它。.
1. 什么是 Abaqus UEXTERNALDB 子程序?它何时使用?
UEXTERNALDB 用户子程序在分析开始时、每个增量开始时、每个增量结束时以及分析结束时调用。.
该子程序促进了ABAQUS/Standard内部其他软件和用户子程序之间的通信。它允许在分析开始时打开其他用户子程序所需的外部文件,并确保在分析结束时关闭这些文件。.
此外,它还可以用于计算或检索每个增量开始时的历史数据,然后将这些数据存储在用户定义的 COMMON 块变量或外部文件中,以便其他用户子程序在分析期间随后使用。.
2. 为什么要使用 UEXTERNALDB 子程序?
- 主要用例
-
- 使用先前运行的数据初始化模拟
- 记录不断变化的内部变量(例如,裂纹长度、损伤指数)
- 在耦合仿真或协同仿真环境之间传输数据
- 相比其他方法(例如 Python 脚本)的优势
UEXTERNALDB 支持实时、仿真内数据交换——这与仅限于预处理和后处理的 Python 脚本不同。它确保了持久的数据跟踪、与外部程序或数据库的无缝通信,以及整个仿真过程中的动态控制。.
3. UEXTERNALDB 的工作原理:幕后揭秘
UEXTERNALDB 子程序是一个用户自定义的入口点,它在仿真作业的特定阶段与 Abaqus 进行交互。它实现了仿真环境与外部数据源、工具或脚本之间的通信,而无需修改核心模型文件。.
数据流和交互
- 输入UEXTERNALDB 读取或写入数据,例如材料属性、边界条件、几何参数或自定义元数据。这些数据通常位于外部文件(例如 CSV、文本、数据库)中,或者通过用户逻辑传递。.
- 输出子程序可以将处理后的输入、结果或日志写回外部存储,从而实现自动跟踪或与其他工具(例如,优化框架或机器学习管道)耦合。.
- 控制流子程序根据标志和变量(如 LOP、STEP 或 TIME)决定在每个阶段执行什么逻辑。.
分析过程中调用它的时机
Abaqus 在分析生命周期的预定义点调用 UEXTERNALDB:
枪管长度
LOP=0 表示该子程序是在分析开始时调用的。.
LOP=1 表示该子程序在当前分析增量开始时被调用。如果增量未能收敛且需要更小的增量,则可以在分析增量开始时多次调用该子程序。.
LOP=2 表示子程序是在当前分析增量结束时调用的。当 LOP=2 时,重新启动分析所需的所有信息都应写入外部文件。.
LOP=3 表示该子程序是在分析结束时调用的。.
LOP=4 表示该子程序是在重启分析开始时调用的。当 LOP=4 时,所有必要的外部文件都应打开并正确定位,并且重启所需的所有信息都应从外部文件中读取。.
以上解释总结如下表:
理解这一流程对于编写高效且无错误的子程序至关重要。.
4. UEXTERNALDB 子程序的基本语法和结构
图 1 显示了 UEXTERNALDB 子程序接口的 Fortran 代码。以下是您通常会使用的模板:
图 1:UEXTERNALDB 子程序接口
待定义的变量
没有任何。.
传入的信息变量
- 枪管长度
- LOP=0 表示在分析开始时调用子程序。.
- LOP=1 表示子程序在当前分析增量开始时被调用。如果增量未能收敛且需要更小的增量,则可以在分析增量开始时多次调用该子程序。.
- LOP=2 表示子程序在当前分析增量结束时被调用。当 LOP=2 时,重新启动分析所需的所有信息都应写入外部文件。.
- LOP=3 表示该子程序是在分析结束时调用的。.
- LOP=4 表示该子程序在重启分析开始时被调用。当 LOP=4 时,所有必要的外部文件都应打开并正确定位,并且重启所需的所有信息都应从这些外部文件中读取。.
- LRESTART
- LRESTART=0 表示不会为本次增量写入分析重启文件。.
- LRESTART=1 表示正在为此增量写入分析重启文件。.
- LRESTART=2 表示正在为此增量写入分析重启文件,并且每个步骤只保留一个增量,以便当前增量覆盖重启文件中的先前增量(请参阅 ABAQUS 分析用户手册第 9.1.1 节“重新启动分析”)。.
- 时间(1)
当前步长值。.
- 时间(2)
当前总时间值。.
让我们来探讨一下步骤、增量和步骤时间的概念:术语‘步骤’指的是您为解决当前问题而建立的分析方法。这可能涉及单个步骤,也可能涉及一系列步骤。更多详情,请参阅这篇文章: “Abaqus DLOAD 和 VDLOAD 子程序分步指南”
- DTIME
时间增量。.
- KSTEP
当前步骤编号。当 LOP=4 时,KSTEP 给出重新启动的步骤编号。.
- 亲缘关系
当前增量号。当 LOP=4 时,KINC 会给出重启增量号。.
5. 实际示例:保存和读取自定义数据
在本节中,我们将讨论如何使用 UEXTERNALDB 子程序将数据导入或导出到 ABAQUS 或从 ABAQUS 导出数据。.
问题描述:
下面举个例子来说明如何使用这个子程序。假设我们有一个物体,它按照下图所示被划分成 10 个网格单元,并且我们假设每个单元都有自己的强度模量或杨氏模量等。.
图 2:由 10 个单元网格划分的物体
假设我们已经将所需数据保存在 .inp、.dat 或 .txt 文件中,现在我们想将这些数据导入 ABAQUS。.
操作方法如下:
首先,我们需要打开特定的数据文件。例如,假设文件保存在:
C:\Users\txt1.dat。.
我们将从该文件加载数据,并在代码中将其称为文件编号 15。我们还将使用 UNKNOWN 状态,该状态指示 ABAQUS 无论目录中是否已存在该文件都继续执行。.
所需命令:
打开 (15, 文件=”C:\\Users\\txt1.dat”, 状态='未知', 格式='格式化', iostat=错误) 我们将在 UEXTERNALDB 子程序中使用前面提到的命令。这个子程序非常简单,但有一点需要牢记。.
UEXTERNALDB 子程序在每次分析、增量或步骤开始时调用一次。它还可以用于打开外部文件、读取历史数据或写入历史数据。.
该子程序的关键部分是 LOP 变量。. LOP 是一个整数,它告诉 Abaqus 何时打开、读取或写入文件。.
例如,如果我们只想在分析开始时读取或导入数据(并避免在每个增量期间使用内存),则设置 LOP = 0。当分析有很多增量时,这很有用,因为在每个增量期间读取文件会重复分配内存。.
或者,设置 LOP = 1 会在每个步骤开始时读取文件,设置 LOP = 2 则会在每个增量结束时读取或写入文件。依此类推,具体取决于您希望何时访问文件。.
现在,让我们看看如何导入之前讨论过的示例问题的数据。.
接下来,我们继续执行子程序,首先展示 .dat 文件的内容。该文件包含基于元素坐标的强度值。.
图 3:数据文件的内容
例如,如图2所示,元素1至5排列在一侧,元素6至10排列在另一侧。(见图2)
首先,元素 1、2、3、4 和 5 将具有来自以下方面的强度值: 第一列, 如图 3 所示。其他元素——6、7、8、9 和 10——将使用来自以下位置的强度值: 第二列 如图 3 所示。.
接下来,我们将实施我们更新后的方案。 外部数据库 子程序:
图 4:UEXTERNALDB 子程序示例
首先,我们定义一个矩阵来存储数据。在本例中,它是一个 5×2 的矩阵,如图 3 所示。然后,我们将这个矩阵重塑为一个 1×10 的数组。.
这是因为像 UMAT 这样的子程序直接接收元素编号。所以,例如,如果我们有 100 个元素,使用 1×100 的数组来管理数据就容易得多,其中每个位置对应一个特定的元素。.
这种重新调整后的格式也使得导入诸如“randomSigma”和“randomSigma2”之类的值变得更加容易,这些值代表元素的特定强度或属性。(参见图4第5行)
在其他子程序中,我们需要创建一个 公共块 将这些数据存储在矩阵中,我们将这些矩阵命名为矩阵。.
接下来,我们将设置 LOP = 0 以便 ABAQUS 读取输入数据 仅在分析开始时进行一次.
为此,我们将使用 打开 使用文件编号 15 的命令来处理我们的特定数据文件。实际的文件编号并不重要,只要在整个子程序中保持一致即可。.
该命令的重要组成部分是关键字 IOSTAT, 该命令会报告文件操作的状态。例如,如果 IOSTAT = 0,则表示文件读取成功,没有任何错误。.
图 5:iostat 关键字
接下来,我们将把“randomSigma”矩阵重塑为“randomSigma2”。为此,我们将使用…… 重塑 按以下格式运行。.
如你所见, 重塑 函数将 randomSigma 矩阵从一个 5×2 将大小转换为 randomSigma2,即 1×10. (参见图5第21行)
接下来,我们将使用 Windows 提供的路径让 Abaqus 读取我们的数据文件。.
请记住,Abaqus 需要使用 双反斜杠 (\) 文件路径中使用反斜杠而不是单个反斜杠。例如:C:\\Users\\YourFolder\\txt1.dat
接下来,为了使用我们的输入数据,我们将把它保存到 UMAT 子程序中的“randomSigma2”变量中,并将其存储在“statev”数组中。.
图 6:statev 数组
我们有 10 个元素或 10 次测量的数据。Abaqus 将元素数量传递给 UMAT 子程序,UMAT 从 randomSigma2 矩阵中读取相应的值。然后,这些值被赋给 xfx 参数。我们将使用 statev 数组来存储和显示这些数据。运行仿真后,我们可以验证 statev(1) 参数是否已正确赋值,如下图所示。.
图 7:UEXTERNALDB 示例结果
6. 常见陷阱和调试技巧
实现 UEXTERNALDB 可能充满挑战,尤其是在处理编译或运行时问题时。以下是一些常见的陷阱以及相应的解决方法:
编译和链接问题
- 编译器兼容性请确保您使用的编译器是您的 Abaqus 版本所支持的编译器(例如,Intel Fortran)。.
- 环境搭建:验证环境变量(例如 ABAQUS_FORT_COMPILER)是否已正确配置。.
- 缺少符号检查所有子程序和库是否已正确声明和链接。使用一致的命名约定。.
- 静态链接与动态链接注意平台之间的差异,尤其是在链接到外部库或 DLL 时。.
常见逻辑错误及其追踪方法
- 文件路径错误:使用调试打印语句在运行时确认文件位置和名称。.
- 未初始化的变量:显式初始化所有变量,以避免出现不可预测的行为。.
- 步骤/阶段执行错误使用 LOP 和 TIME 变量来确认子程序处于分析的哪个阶段。.
- 无声的失败如果子程序运行不符合预期,则插入日志消息或将调试信息写入外部文件。.
- 数据类型不匹配注意整数精度和实数精度的区别。函数调用时应使用一致的数据类型。.
提示: 从简单的入手——先用一个最小可运行示例进行测试,然后再逐步扩展。这有助于更容易地发现问题,并增强对实现的信心。.
7. 编写高效 UEXTERNALDB 代码的最佳实践
编写高效的 UEXTERNALDB 代码是维持稳健、可扩展的仿真工作流程的关键。以下是确保性能和可维护性的最佳实践:
文件处理
- 使用绝对路径 或者使用基于环境变量的相对路径,以避免文件访问问题。.
- 仅在需要时打开文件, 并及时关闭它们,以防止文件锁定或内存泄漏。.
- 避免冗余的读/写操作, 尤其是在大规模参数研究中。尽可能对数据进行缓冲。.
性能提示
- 尽量减少 I/O 操作 在循环或大型模拟中;在工作流程早期预加载或缓存数据。.
- 分析你的子程序 使用计时器或轻量级日志来识别瓶颈。.
- 使用二进制或结构化文件格式 (例如 HDF5、CSV)用于大型数据集,以加快读/写操作。.
模块化
- 将逻辑拆分成可重用的子程序 (例如,用于读取数据、处理参数、记录输出)。.
- 使用有意义的变量名和注释 提高代码可读性,减少调试时间。.
- 封装配置 将(例如,文件路径、常量)放在一个模块中,以便于将来更新。.
高效的 UEXTERNALDB 代码不仅可以加速仿真,还可以使您的工作流程更容易调试、扩展和跨团队共享。.
8. 高级用例
UEXTERNALDB 子程序通过实现与外部工具的无缝集成和高级自动化,扩展了 Abaqus 的功能。它在以下两个方面表现尤为出色:
- 与外部工具或数据库耦合
- 材料属性检索 来自集中式数据库。.
- 自动日志记录 用于可追溯性的输入/输出数据。.
- 与设计工具集成 例如 DoE 框架或自定义脚本。.
- 与其他软件通信, 包括优化引擎或云 API。.
这可以确保数据一致性,减少人工操作,并支持复杂的工作流程。.
- 自动化参数研究或机器学习集成
UEXTERNALDB 非常适合用于自动化大型模拟活动和支持人工智能驱动的方法:
- 参数模拟 可通过外部输入文件进行控制,减少手动更新。.
- 代理模型或机器学习模型集成, 其中,预测结果被导入以指导模拟。.
- 自动数据提取 用于构建或更新机器学习数据集。.
- 自适应工作流程, 其中,仿真结果会影响优化循环中的下一次运行。.
9. 与其他用户子程序的比较
当您需要在分析过程中进行持久的、外部的、与模型无关的数据处理时,请使用 UEXTERNALDB。.
10. 结论
掌握 Abaqus 中的 UEXTERNALDB 子程序,即可通过集成外部数据源实现高级仿真。本文重点介绍 Abaqus 中的 UEXTERNALDB 子程序,阐述其用途、优势和结构,帮助各级别用户高效地使用它。其主要用途包括初始化数据、导出结果以及促进步骤间的通信——相比 Python 脚本等方法,这些优势尤为突出。本文还介绍了 UEXTERNALDB 如何与仿真过程交互,解释了其语法,并提供了一个实用的代码示例。最后,本文重点阐述了常见错误、调试技巧以及使用 UEXTERNALDB 增强仿真控制和自动化的更广泛优势。.







