首页/文章/ 详情

超越 Abaqus/Exp 中的子程序:一个关键字让生活更轻松

10天前浏览871

  本文摘要:(由ai生成)

本文介绍了在Abaqus/Explicit中实现自主终止分析的多种方法,包括使用用户子程序XIT和VUAMP,以及EXTREME VALUE和FILTER关键字。文章通过一个3点弯曲试验的模型,展示了如何应用这些技术来监测反作用力并在特定阈值下终止分析。文章强调Abaqus求解器功能的不断发展使得复杂功能更易使用,子程序在某些工作流程中已非必需。这些方法为Abaqus用户提供了更灵活、高效的分析终止方式。  

               

      在Abaqus/Explicit中,我们通常采用子程序来监测运行并在一定条件下终止运算。幸运的是,随着更新,越来越多的方法来实现此功能。Abaqus基于单点加载历史进行求解,将其离散为加载步骤,但本文将关注Abaqus/Explicit中的功能。我们将探讨求解器如何自主终止步骤或整个分析,而无需重新培养编程技能。这对于不知道加载事件最终状态定义的问题特别有益。我们将使用简化的3点弯曲试验模型,关注Abaqus/Explicit中的等效功能和关键字。同样,所有非线性都存在:接触(带摩擦)、几何非线性以及(对于本次讨论而言很重要的)塑性,简化为双线性弹塑性响应。        

                           

             

               

        该模拟由两个显式动态步骤组成,上十字头向下移动以压弯试样发生塑性变形,第二步将十字头返回到原始位置,观察零件的弹性回弹和残余变形。        

        当我们运行这个模型时,我们会看到预期的整体机械响应,如果我们绘制十字头处的反作用力,则会看到由于系统中不断发展的非线性而引起的十字头处反作用力梯度的变化。               

现在,很明显,结果非常嘈杂。我故意不尝试通过默认体积粘度或历史输出过滤之外的附加阻尼来调整这一点。唯一防止棒材偏离的因素是部件之间界面处的摩擦力与重力载荷相结合,这足以抵消弹性回弹中释放的能量,并在十字头缩回时将变形的棒材保持在下辊上,并且酒吧实际上不受约束。         

与隐式版本一样,这种测试设置足以满足我们的目的:该模型在两个步骤的位移控制下都非常有效地求解,并且我们实现了我们想要的整体机械响应。        

因此,现在,对于该模型的显式版本,我们应用与之前相同的思想实验:如果我们查看这些结果,现在发现也许我们真正想要的是实现反作用力,例如 - 4500N 是为了更好地复 制物理测试的第一步,而不是仅仅应用固定位移并“看看会发生什么”?         

      

方法一 - 利用用户子程序 XIT

        首先,这种方法并未实现我们想要的结果,但在需要在模型中某个位置满足特定条件时终止分析时,该方法仍相对简单且实用。子例程对许多Abaqus用户来说可能是一个盲点,对于初次使用者,安装预备编译器并将其与特定版本的Abaqus链接可能需要额外帮助。在这个例子中,我们使用VUAMP子例程进行模型准备,一些关键字的编辑需手动完成。需要在输入文件的“模型数据”部分定义AMPLITUDE,以及在横梁控制节点创建NSET,用于监视反作用力。这些修改能够实现分析与子例程之间的数据交互,是实现所需功能的关键步骤。

       

现在,在加载步骤的“步骤数据”中,我们为振幅定义了一个零力的虚拟 CLOAD,以便振幅对其进行操作,因为我们对横梁应用的位移遵循默认的 RAMP 定义。    

最后,在加载步骤的“步骤数据”中,还需要在横梁加载点处创建沿着施加位移方向的反作用力的传感器历史输出,这将传递给子例程进行条件检查。    

             

        顺便说一下,在Abaqus/CAE中,将历史输出定义为传感器是本机功能,可通过“步骤模块”中的“创建历史输出”对话框完成,如下图所示:    

尽管我们将使用VUAMP子例程(它本身是UAMP子例程的“显式版本”,用于与Abaqus/Standard一起使用)。

所以,这就是调整后的Abaqus输入文件,以向子例程传递有用的数据。现在,我们需要创建一个子例程,使用文档中的VUAMP模板作为基础,并添加以下语句:

  • 从求解器中提取传感器数据,每完成一个解的增量。

  • 对反作用力进行条件检查,以确定它是否(在这种情况下)小于目标值。

  • 对解的每个增量进行迭代,以便一旦满足条件,执行XIT命令并终止仿真。

   

值得注意的是,XIT命令在大多数子例程中都是被识别的——我们只是在这里方便地使用了VUAMP,以便以后研究其他选项。

假设已安装并与执行的Abaqus版本链接的Fortran编译器,我们可以使用以下命令行选项执行此作业:

         abaqus job=<Job-name> user=<subroutine_name>.f        

当运行作业时,解决方案会正常进行,直到达到传感器节点的反作用力首次超过用户指定的阈值的第一个增量,然后执行XIT命令,分析在该点干净地终止。在Abaqus/Explicit中,状态文件将在执行XIT命令之前停在最后一个输出框架 - 就求解器而言,某些情况阻止其达到下一个输出框架和加载历史的终点,但在这种情况下实际上是可以接受的。

这是相当简洁和容易设置的方法,但从两个方面来看并不符合我们的要求:

  • 显然,分析仅在满足条件的点终止:我们真的希望步骤终止,并且分析继续进行到卸载步骤。

  • 终止点的控制有点粗糙,尤其是结果中的噪音:在第28帧,计算的反作用力为-3990N(明显低于终止阈值),在第29帧,计算的反作用力为-4549N(高于终止阈值),因此XIT命令在两个输出框架之间的某个增量处执行,但我们只能看到输出框架28的结果。


方法二 - VUAMP子程序 lFlagsDefine(iConcludeStep)

在考虑到这些限制的情况下,我们可以通过对VUAMP子例程进行一些调整来取得更好的效果...

首先要注意的是,VUAMP子例程中有一个方便的内置变量,我们可以设置,求解器知道如何处理。如果我们设置:

  • lFlagsDefine(iConcludeStep) = 0 ....步骤应该继续到下一个增量。

  • lFlagsDefine(iConcludeStep) = 1 ....步骤应该在此增量终止。

因此,通过简单地将XIT命令替换为lFlagsDefine(iConcludeStep) = 1.0,我们就可以实现相同的结果,而且这个功能已经内置在子例程中,而不是一个外部命令。

与XIT相比,这也是功能的改进,因为只有步骤被终止,求解器会继续进行加载序列中的任何后续步骤(XIT会在调用点终止整个解决方案)。

         

        然而,必然地,没有免费的午餐。在第二个/卸载步骤中,由于第一个步骤被终止,求解器简单地将其视为另一个加载事件,因此从加载步骤终止点的大横梁位移跳跃到卸载步骤中定义的零位移太过激烈而难以实现(正如在隐式模型中一样,我们可能都能想到克服这个问题的方法...但是,让我们不要破坏一个好故事)。

        然而,通过对输入文件进行一些调整,通过在VUAMP子例程中跟踪步骤时间、总时间和横梁位移来计算AMPLITUDE,以控制卸载步骤的位移,我们可以实现以下过程:

  • 完成加载步骤,达到用户定义的反作用力阈值。

  • 在满足条件语句的点终止加载步骤。

  • 继续进行卸载步骤,使用第一步的终止点作为第二步的起点。

  尽管通过子程序进行仿真控制需要一些努力,但实现相似功能的替代方法也是可行的。在Abaqus/Explicit中,内置的终止功能访问方式不同于Abaqus/Standard,需要探索替代方法和关键字来克服步骤终止策略的一些限制。这突显了子例程在用户工具箱中的价值,同时也强调了通过简单修改工作流程即可达到相似效果的可能性

第三种方法 - *EXTREME VALUE 关键字

在Abaqus/Explicit中放弃子例程的工作流之后,首先要说的是软件中已经存在了很长时间的仅关键字功能,允许在某个阈值点终止分析。确实,它‘仅仅’相当于XIT功能,因此并不能完全符合我们在这里讨论的工作流,但是(与XIT一样)它可能是有用的。

基本上,这里的思想是存在用于在步骤内监视节点或元素的功能,以获取特定变量的值,并检查这些值是否超过阈值,使用 *EXTREME NODE VALUE*EXTREME ELEMENT VALUE 关键字。

这些监视语句可以与 *EXTREME VALUE 关键字一起使用,然后根据条件语句的满足采取行动:这个关键字的唯一选项是什么都不做,或者在超过阈值后的增量终止分析。

在我们的情况下,我们希望监视横梁节点的DOF 2处的反作用力,并且 - 为了这个例子的目的,从可用选项中选择 - 终止分析。为此,我们需要在加载步骤的分析步数据中添加以下关键字:正常运作,并在超过阈值的增量终止加载步骤,只留下最接近的前一输出框架的结果而已。

在这方面,它类似于XIT子例程命令 - 从其简单性和限制性的角度来看。而且,如前所述,这是仅关键字的功能(再次强调一下,除非您将打开关键字编辑器算作‘GUI的一部分’,否则不能在Abaqus/CAE中定义它!)。

虽然接近,但仍然不完全符合我们的要求...但不要绝望 - 还有一个解决方案!

方法四 - *FILTER 关键字

在多个版本中,*FILTER 关键字已经添加了一些选项,以更接近我们尝试通过子例程实现的目标。至少从v2018开始,此关键字已经具有可选参数,用于在被监视的历史数据的值(用于历史输出中的信号过滤)超过定义的值时终止仿真(听起来很熟悉)。从v2019开始,这被扩展为能够根据限制值终止步骤或整个分析(似曾相识吗?),从v2021开始,添加了在终止点创建额外输出帧的能力,以便能够可视化限制值的结果,而不仅仅是作为整体场输出定义/频率的一部分写入的最后一个框架(这有点吓人!)。

        首先,我们需要在Abaqus/CAE中定义过滤器的基本元素,然后将其应用于传感器历史输出以触发步骤终止。在 STEP 模块中,我们通过工具菜单创建一个“运算符”类型的过滤器。在此过滤器中,我们设置将稍后应用于传感器节点的条件检查,如下所示。目前,我们还将选中在达到-4500的限制值时终止分析的复选框(在此情况下是牛顿,因为我们将使用与之前相同的传感器,监视横梁反作用力)。

现在,有了此过滤器的条件运算符的定义,我们可以回到用作传感器的历史输出,并将此过滤器应用于它。该设置与我们为子例程监视传感器定义的历史输出相同......只是现在我们将过滤器应用于历史输出。                 

 

        当这个功能出现在输入卡中时,与Abaqus/CAE相比,一切看起来都让人感到熟悉和安心。首先,*FILTER 关键字捕获了我们输入的定义过滤器的所有相关信息,并在输入卡的模型数据部分中进行了定义。

        其次,该过滤器应用于横梁反作用力历史输出,我们之前定义并用作传感器。   

        这都是非常好和有用的功能,我们可以通过Abaqus/CAE界面中提供的选项进行定义......但是,正如我们已经说过的,通过在提交作业之前对输入卡中 *FILTER 定义进行一些精心编辑,我们可以做得更好。到目前为止,我们已经指定分析将在满足过滤器条件的点终止,但我们现在将使用替代选项 'halt=STEP' 仅终止加载步骤,并允许分析继续进行卸载步骤。我们还将要求在满足终止条件的确切增量时在.odb文件中添加一个额外的输出帧。当我们这样做时,*FILTER 行看起来像这样:   
        进行了这些手工编辑后,由于我们现在不再需要子例程,也不再需要Fortran编译器作为前提条件,我们可以像在命令行中执行任何其他作业一样,简单地执行该作业
abaqus job=<Job-name>
1.加载步骤运行到压缩反作用力在横梁头超过4500 N的解的增量,加载步骤终止,并在.odb文件中添加一个额外的输出帧。

2.分析继续进行到卸载步骤,作业完成。

3..sta文件以有意义的方式捕获了所有这些信息(在这种情况下,您只能相信我的话,因为它太大了,无法捕获所有相关的输出并放在这里的图像)。此模拟的动画显示横梁在加载步骤终止时在4500 N的反作用力点停止运动,然后横梁被缩回。

这里简要说明一下:我特意没有显示卸载步骤的反作用力 - 正如之前提到的,我已经使用位移边界条件驱动横梁,以保持与先前文章中的隐式模型一致。这意味着加载步骤突然终止和横梁运动方向瞬间切换在卸载步骤开始时产生了一个大的、振荡的、扰动力,这会掩盖我们想要在加载步骤的图表中看到的结果(在这种情况下没问题,因为在那时,横梁的所有变形都已经完成,我们对局部横梁行为不感兴趣)。

所以,我们到达了目标......再次!我们旨在开发的工作流程已经在Abaqus/Explicit中高效实现,而不需要例序程。

结论

那么,我们从这里学到了什么呢:

  • 或许最重要的是,Abaqus求解器功能仍在不断发展,曾经只有少数Fortran专家才能掌握的功能现在已经成为Abaqus输入文件的本机功能;

  • 在Abaqus/Explicit分析中增加一定程度的自主性和决策能力现在相对容易,即使只是对输入文件结构有基本的理解。

  • 子程序仍然有用,对于Abaqus用户的工具箱仍然有其位置,但在这个工作流程中不再是必需的......不再是了!

来源:ABAQUS仿真世界
Abaqus非线性控制试验清华 DeST
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-23
最近编辑:10天前
yunduan082
硕士 | 仿真主任工程... Abaqus仿真世界
获赞 118粉丝 130文章 225课程 0
点赞
收藏

作者推荐

未登录
还没有评论

课程
培训
服务
行家

VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈