本文将介绍用户自定义关键子 *USER_keyword,通过该关键子,用户可以定义自己的关键字,并在用户子程序中实现,让自己开发的用户模块的输入更有效,功能更丰富。
LS-DYNA 在实际工程中得到了非常广泛的应用,成功地解决了很多大规模非线性问题。用户在几十年的应用过程中积累了非常多的模型数据,比如各个部件的有效模型,各个机构的建模方法,各种材料的参数库,以及各种求解控制参数等等。这些数据都是经过长期应用反复验证的,在实际应用中也非常有效。如何把这些数据准确可靠地应用到新的数值分析中,很多用户都根据自己的模型特点建立一套管理方法来尽量避免模型差错。目前 LS-DYNA 的模型输入文件是主要是静态模型文件(关键字文件),对于脚本的语言缺乏良好的支持。在新的二次开发环境下,用户可以通过用户子程序来实现动态的模型生成功能,实现建模自动化,比如:
LS-DYNA 新的二次开发环境支持用户子程序与 LS-DYNA 的主程序完全分开,在运行时无需连接。在以前的模式下,用户子程序必须与 LS-DYNA 的具体执行程序相关联,不同的执行程序往往需要重新编译连接才能执行。当模型还需要别的用户子程序时,往往会产生冲突。因此,当这种限制被突破以后,用户开发的动态建模的用户子程序就成为了模型的一部分,与 LS-DYNA 的执行程序是完全分开,只有在该模型被读入的时候该子程序才被动态调用。这种新的开发模式导致了用户子程序在概念上有一个比较大的改变,即把用户子程序和用户数据绑定在一起,而与 LS-DYNA 的执行程序无关,提高了用户子程序的一致性和可维护性。
我们以两个简单的例子来介绍在新的开发环境下,如何利用用户子程序来动态产生用户关键字,实现模型输入上的自动化。
这是一个简单的例子,用来演示如何在现有的模型中生成一个长方块(假定为某个部件)。这个长方块的网格生成程序非常简单,但演示了开发的全过程。其源程序已经包含在 LS-DYNA 用户子程序开发包里面,用户可以根据需要开发出一个实用的部件生成子程序。
如图一所示,先建立一个简单的常规静态模型,由三块板组成的。现在通过以下几个步骤利用新的用户关键字功能来实现长方块的动态生成:
isexample=0
改为
isexample=1
这个自带的动态网格生成功能就能使用了。参阅前面两篇文章,将用户子程序编译连接为动态连接库就可以。假定该动态连接库的名字为 libdemo.so
*MODULE_LOAD mydemo libdemo.so
*USER_keyword 100., 20., 30., 10, 2, 3
这个简单演示程序是生成一个长方块,先读入 6 个参数,分别是 X,Y,Z 方向的长度,及其相应的单元划分单元个数。此例中输入为 X 方向长为 100,划分 10 个单元。运行 LS-DYNA 则在初始的静态模型中动态添加了一个新的长方块,如图二所示。
图一:三块板组成的简单模型
图二:含有动态生成长方块的模型
用户关键字的子程序统一入口是定义在 dyn21.f 中的 rdusrkwd 子程序。其第一个参数 iphase 是控制整个子程序的运行流程,其它参数见源程序中的说明。在 LS-DYNA 读入模型文件的过程中,如果遇到用户关键字 USER_keyword,则设置 iphase= 1 后直接调用该子程序,rdusrkwd。从此之后的输入完全有该子程序控制,直到该子程序退出。该子程序在 iphase= 1 时主要任务是读取相应的参数,如上节示例中的 6 个参数,然后可以直接在内存里面生成 LS-DYNA 标准的关键字。比如上例中的节点和单元数据,以行为单位保存。在子程序退出之前将另外一个参数设置为 iflag=1,表明用户的关键字已经处理结束并且相关卡片可以输出。
LS-DYNA 会根据 iflag= 1 的返回值,会设置 iphase= 2 并重复调用该子程序,rdusrkwd,每次以文本方式返回一行卡片数据。当生成的模型卡片读完后,直接将 iflag 设置 0,表明结束。至此,经过这生成和读入两个阶段后,对应的关键字 USER_keyword 就处理完毕,LS-DYNA 的主程序将继续读入并处理余下的关键字。
这个子程序的具体执行过程请参阅 dyn21.f 中的源程序的细节,在此不做详细介绍。下面补充几个细节:
[版权声明] :本文文字、代码及图片版权归原作者所有,任何媒体、网站或个人未经本网协议授权不得采集、整理、转载或以其他方式复制发表。已经本站协议授权的媒体、网站,在使用时必须注明“稿件来源:学研谷”。