本文摘要(由AI生成):
该文本介绍了在 Abaqus/Standard 中终止分析步或整个分析的三种方法。第一种方法是使用用户子例程实用程序 XIT。第二种方法是使用 UAMP 子例程实用程序 lFlagsDefine(iConcludeStep)。第三种方法则是使用 *STEP CONTROL 关键字。本文还以三点弯曲测试的简化模型为例,进行了详细说明。
目录
方法 1:用户子例程实用程序 XIT
方法 2:UAMP 子例程实用程序 lFlagsDefine(iConcludeStep)
方法 3:*STEP CONTROL 关键字
我们还需要 Abaqus 子程序吗?
本文让我们探讨如何在 Abaqus/Standard 中使用新关键字来实现中断分析步或整个分析,我们也将在以后讨论如何在 Abaqus/Explicit中实现。
好吧,我们以下面的模型为例。它是 3 点弯曲测试的简化模型,以检查不同非线性对采用的最佳仿真策略的影响。所有非线性因素都存在:接触(有摩擦)、几何非线性,以及对于本次讨论至关重要的塑性,采用简化双线性弹塑性响应。
模拟包括两个静态步骤。两个下辊被固定,上十字头向下移动以弯曲棒材并在模拟的第一步期间引起塑性变形。第二步,将十字头恢复到原始位置,观察零件的回弹和残余变形。
为了增强加载步骤中的收敛性(其中杆中的残余力仅通过其顶面和底面上的接触力来平衡),并且重要的是,为了在卸载步骤中有效地将十字头返回到其初始位置,十字头在位移控制下驱动。
运行该模型后,我们观察到预期的整体力学响应。如果我们绘制十字头处的反作用力,我们可以看到由于系统中不断发展的非线性而导致反作用力的变化。
注意:您可能会注意到,当十字头位移使其脱离与杆的接触时,反作用力不会减小到零。在这种情况下,在卸载步骤中使用少量的自动稳定以防止棒材偏离,并且不施加其他载荷。由于十字头也在抵抗这种自动稳定的粘性而移动,因此需要很小的力来实现这一点。这个力的相对大小是判断自动稳定是否显着影响潜在的力学行为的标准。
该模型在两个步骤的位移控制下都非常有效地求解,并且我们实现了所需的响应。但是,如果我们检查这些结果并意识到我们真正想要实现的是第一步的反作用力,例如 -4500N,以便更好地复 制物理测试,而不仅仅是应用固定位移并看看会发生什么? 嗯,有多种方法可以实现这一点,但随着模型和研究变得更加复杂,维护位移控制工作流程并允许 Abaqus 求解器在预定义的十字头上自主终止位移控制加载步骤可能会更方便(反应)负载。
那么,Abaqus/Standard 中有哪些方法来实现呢?
XIT 子程序是一个实现在满足某些条件时结束分析的简单工具。如果您不熟悉 Abaqus 子程序那么困难还是比较大的。因为,一般来说,使用 Abaqus 子程序不可避免地需要一些 Fortran 编程技能。
我们需要做的第一件事是准备模型以允许子程序与其交互,在求解器和子程序之间传递数据。在本例中,我们将使用 UAMP 子程序。其中一些修改可以在 Abaqus/CAE 中实现,但在本例中,我们将手动完成。对基本模型必要的关键字编辑如下所示。
对于输入文件的“模型数据”(在步骤数据之前定义模型本身的所有内容),我们需要定义一个Amplitude,这将是分析与 UAMP 子程序交互的方式,以及我们想要的位置的 NSET定义一个“传感器”来监测反作用力。在这种情况下,我们传感器是十字头控制节点的反作用。
现在,在加载步骤的步骤数据中,我们将定义一个零力的虚拟 CLOAD,以便在我们将位移应用于十字头时操作,该位移遵循默认的 RAMP 定义。
最后,同创建十字头加载点处反作用力的传感器历史输出(沿位移施加的方向),该输出将传递到子程序进行条件检查。
因此,现在我们调整了 Abaqus 输入文件以将有用的数据传递给子例程。我们现在需要创建一个子程序,使用记录的 UAMP 模板作为基础,并添加以下语句,这将:
当每个增量步完成时,从结果中提取传感器数据(红色框);
对反作用力执行条件检查以确定其是否小于目标值(绿色框)
为每个增量循环执行 IF 语句,一旦满足条件,就会执行 XIT 命令,并且模拟终止(蓝色框)
大多数 Abaqus 子例程都可以识别 XIT 命令;我们只是在这里方便地使用了 UAMP,以便稍后研究其他选项。假设安装了 Fortran 编译器并链接到执行的 Abaqus 版本,我们可以使用命令行选项执行此作业:
abaqus job=<Job-name> user=<subroutine_name>.f
当我们运行作业时,求解将正常进行,直到达到第一个收敛增量,其中传感器节点的反作用力超过用户指定的阈值。此时执行 XIT 命令,分析终止。
这非常简洁且易于设置,但它在两个方面不满足我们的要求:
分析在满足条件语句时终止。但我们却希望该步骤终止并且分析继续进行卸载步骤;
终止点的控制不够精细,特别是在应用自动时间增量的情况下。在增量 23 处,计算出的反作用力为 -4473 N(刚好低于终止阈值),在增量 24 处,计算出的反作用力为 -4598 N(高于终止阈值)。所以,XIT命令被执行,而不是准确的-4500N;
UAMP 子程序改进了 XIT 子程序,提供了一个内置变量,告诉求解器继续或结束步骤。通过调整子程序和输入文件,我们可以实现继续分析卸载过程的目标。这种方法让我们更接近目标,但实现精确的阈值仍然是一个挑战。
UAMP 子程序中有一个方便的内置变量IFlagsDefine,并且求解器知道如何处理。如果我们设置:
lFlagsDefine(iConcludeStep) = 0 …该步骤应继续到下一个增量
lFlagsDefine(iConcludeStep) = 1 …该步骤应在此增量处终止
因此,通过简单地替换子例程中的 XIT 命令 lFlagsDefine(iConcludeStep) = 1,我们可以使用子程序中内置的功能(而不是外部命令)实现相同的结果。与 XIT 相比,这是功能上的改进,因为仅终止该步骤,并且求解器继续执行后续步骤。
然而,在第二个/卸载步中,解算器只是作为另一个加载事件继续下一步,因为第一步已终止。因此,从加载步骤终止点到卸载步骤中定义的零位移的跳跃太剧烈而无法实现。但是,通过对输入文件进行一些调整,通过我们在 UAMP 子程序中计算的 AMPLITUDE 来控制卸载步骤的位移,通过跟踪步骤时间、总时间和十字头位移,我们可以实现以下过程:
执行加载步骤直至达到用户定义的反作用力阈值;
在满足条件语句时终止加载步骤;
继续执行卸载步骤,使用第一步的终止点作为第二步的起点;
real :: MaxAmpValue=-40.0, Treshold = -4500.0
real :: reaction=0.0, displacement=0.0, temp=0.0, totalStepDuration=1.0, currentStepTime = 1.0
reaction = GetSensorValue('SENSOR_FORCE',
jSensorLookUpTable,SensorValues)
displacement = GetSensorValue('SENSOR_DISP',
jSensorLookUpTable,SensorValues)I
IF (IFlagslnfo(ikStep) .EQ. 1.0) THEN
IF (reaction) .LT. (treshold) THEN
temp = (time(iStepTime) / totalStepDuration) * MaxAmpValue
ELSE IFIagsDefine(iConcludeStep) = 1
END IF
ELSE CurrentStepTime = (totalStepDuration - time(iStepTime))
temp = displacement * ( currentStepTime / totalStepDuration)
END IF AmpValueNew = temp
当我们可视化这些结果时,我们确实得到了我们想要的东西,但这个过程可能会更容易、更准确,因为我们仍然没有完全达到所需的终止力。
Abaqus 更新中引入的步骤控制关键字完美地解决了我们的分析步终止挑战。只需输入文件中的几行,我们就可以定义结束步骤的条件,并在接近终止点时优化步骤时间。这种基本自带功能显着简化了我们的工作流程,无需使用 Abaqus 子程序和编译器。
要在工作流程中使用步骤控制,我们需要对加载和卸载场景的原始 Abaqus 模型执行以下操作:
在 Abaqus/CAE 中本地定义十字头控制节点的反作用力传感器,或者定义反作用力传感器;
将加载步骤的历史数据中的以下关键字添加到输入文件中,如下所示:
输入文件中的这两行定义了以下事件:
创建一个名为STEP_SENSOR的传感器作为STEP CONTROL的控制条件(每个分析步可以有多个步骤控制);
在这种情况下,当条件语句成立时结束分析步,并在解接近终止条件时使用自动步长细化;
触发分析步结束的条件语句:十字头控制节点处的反作用力 (SENSOR_FORCE) 超过 -4500 N 的值;
当传感器力超过-4300 N的值时,从STATIC关键字定义的自动时间步长切换到更精细的固定时间增量,使得步进终止点更接近所需的-4500 N值。
这两行关键字处理了许多有价值的工作。现在,因为我们不需要子程序,所以我们也不需要 Fortran 编译器,我们可以像执行其他作业一样在命令行中简单地执行该作业:
abaqus job=<Job-name>
然而,当分析步终止时,求解器仍继续进行卸载步骤。因此,从结束到终止的加载步骤再到卸载步骤的开始的跳跃太大,以至于卸载步骤甚至无法开始收敛。值得庆幸的是,我们可以通过最近添加的原生关键字来克服这个问题。此功能采用了现有 Abaqus 重启功能的理念,并对其进行了显着扩展、简化和增强。我们要做的事如下:
创建一个仅包含加载分析步的输入文件,包括如上所示的 STEP CONTROL 行,当满足相同的条件标准时(在本例中,关键字选项“ACTION = END”)我们终止分析STEP“终止该步骤,以及整个分析。选项“ACTION = END ANALYSIS”也是可用的)
创建一个单独的输入文件,其中仅包含卸载步骤的历史数据。(下面的代码片段就是我们所需要的)
创建另一个输入文件,其中仅包含 MANIFEST 关键字并引用模型数据、加载步骤和卸载步骤的输入文件
像处理任何其他输入文件一样执行此清单 Abaqus 作业。
然后按顺序执行 MANIFEST 关键字下引用的所有输入文件。但是,关键的是,“BASE STATE = YES”选项意味着第二个输入文件中包含的卸载步骤的基本状态是来自第一个输入文件的终止加载步骤的最终状态。
此外,两个文件执行过程中的所有数据都包含在单个 Abaqus 文件结构中(编辑后的状态文件如下所示),包括 .odb 文件。
Abaqus 求解器不断改进,通过输入文件将先进的功能带到所有用户的手中。现在,即使您刚刚掌握输入文件基础知识,为 Abaqus/Standard 分析添加一定程度的自主性也非常简单。虽然 Abaqus 子程序对于许多复杂的任务来说都是有价值的工具,但它们在这个特定的过程中却处于次要地位。