浅谈ABAQUS用户子程序

更新时间:2024-03-27 01:58:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

李青 清华大学工程力学系

摘要 本文首先概要介绍了ABAQUS的用户子程序和应用程序,然后从参数,功能两方面详细论述了DLOAD, UEXTERNALDB, URDFIL三个用户子程序和GETENVVAR,POSFIL,DBFILE三个应用程序,并详细介绍了ABAQUS的结果文件(.FIL)存储格式。

关键字 ABAQUS,用户子程序,应用程序,结果文件

一、前言:

ABAQUS为用户提供了强大而又灵活的用户子程序接口(USER

SUBROUTINE)和应用程序接口(UTILITY ROUTINE)。ABAQUS 6.2.5一共有42个用户子程序接口,13个应用程序接口,用户可以定义包括边界条件、荷载条件、接触条件、材料特性以及利用用户子程序和其它应用软件进行数据交换等等。这些用户子程序接口使用户解决一些问题时有很大的灵活性,同时大大的扩充了ABAQUS的功能。例如:如果荷载条件是时间的函数,这在ABAQUS/CAE 和INPUT 文件中是难以实现的,但在用户子程序DLOAD中就很容易实现。

二.在ABAQUS中使用用户子程序

ABAQUS的用户子程序是根据ABAQUS提供的相应接口,按照FORTRAN语法用户自己编写的代码。在一个算例中,用户可以用到多个用户子程序,但必须把它们放在一个以.FOR为扩展名的文件中。运行带有用户子程序的算例时有两种方法,一是在CAE中运行,在EDIT JOB菜单的GENERAL子菜单的USER SUBROUTINE FILE对话框中选择用户子程序所在的文件即可;另外是在ABABQUS COMMAND用运行,语法如下:

Home

序,但可以调用用户自己编写的FORTRAN子程序和ABAQUS应用程序。当用户编写FORTRAN子程序时,建议子程序名以K开头,以免和ABAQUS内部程序冲突。

2.当用户在用户子程序中利用OPEN打开外部文件时,要注意以下两点:一是设备号的选择是有限制的,只能取15-18和大于100的设备号,其余的都已被ABAQUS占用。二是用户需提供外部文件的绝对路径而不是相对路径。 3.ABAQUS 应用程序必须由用户子程序调用。

当用到某个用户子程序时,用户所关心的主要有两方面:一是ABAQUS提供的用户子程序的接口参数。有些参数是ABAQUS传到用户子程序中的,例如

SUBROUTINE DLOAD中的KSTEP,KINC,COORDS;有些是需要用户自己定义的,例如F。二是ABAQUS何时调用该用户子程序,对于不同的用户子程序ABAQUS调用的时间是不同的。有些是在每个STEP的开始,有的是STEP结尾,有的是在每个INCREMENT的开始等等。当ABAQUS调用用户子程序是,都会把当前的STEP和INCREMENT利用用户子程序的两个实参KSTEP和KINC传给用户子程序,用户可编个小程序把它们输出到外部文件中,这样对ABAQUS何时调用该用户子程序就会有更深的了解。

下面就选出几个常用的用户子程序和应用程序进行详细解释: 一.SUBROUTINE

DLOAD(F,KSTEP,KINC,TIME,NOEL,NPT,LAYER,KSPT,COORDS,

JLTYP,SNAME) 参数:

1. F为用户定义的是每个积分点所作用的荷载的大小;

2. KSTEP,KINC为ABAQUS传到用户子程序当前的STEP和INCREMENT值; 3. TIME(1),TIME(2)为当前STEP TIME和INCREMENT TIME的值; 4. NOEL,NPT为积分点所在单元的编号和积分点的编号; 5. COORDS为当前积分点的坐标;

6. 除F外,所有参数的值都是ABAQUS传到用户子程序中的。 功能:

1. 荷载可以被定义为积分点坐标、时间、单元编号和单元节点编号的函数。

Home

2. 用户可以从其他程序的结果文件中进行相关操作来定义积分点F的大小。 例1:这个例子在每个积分点施加的荷载不仅是坐标的函数,而且是随STEP变化而变化的。

SUBROUTINE DLOAD(P,KSTEP,KINC,TIME,NOEL,NPT,LAYER,KSPT,COORDS, 1 JLTYP,SNAME) C

INCLUDE 'ABA_PARAM.INC' C

DIMENSION TIME(2),COORDS(3) CHARACTER*80 SNAME

PARAMETER (PLOAD=100.E4) C

IF (KSTEP.EQ.1) THEN !当STEP=1时的荷载大小 P=PLOAD

ELSE IF (KSTEP.EQ.2) THEN !当STEP=2时的荷载大小

P=COORDS(1)*PLOAD !施加在积分点的荷载P是坐标的函数 ELSE IF (KSTEP.EQ.3) THEN !当STEP=3时的荷载大小 P=COORDS(1)**2*PLOAD

ELSE IF (KSTEP.EQ.4) THEN !当STEP=4时的荷载大小 P=COORDS(1)**3*PLOAD

ELSE IF (KSTEP.EQ.5) THEN !当STEP=5时的荷载大小 P=COORDS(1)**4*PLOAD END IF RETURN END

二. UBROUTINE

UEXTERNALDB(LOP,LRESTART,TIME,DTIME,KSTEP,KINC) 参数:

用户可以利用LOP开关来控制自己的代码程序何时被ABAQUS调用。LOP=0(3)表示在计算的开始(结束)ABAQUS调用此用户子程序;LOP=1 (2) 表示在每个INCREMENT的开始(结束)ABAQUS调用此用户子程序;LOP了=4 表示在每个RESTART的开始ABAQUS调用此用户子程序。这为用户子程序提供了很

大的灵活性。 功能:

1. 可以用来和其它用户子程序及其它软件进行数据通讯。 2. 可以用来在适当的时间打开,关闭外部文件。

3. 用户可以把自己编写的ABAQUS扩充功能的程序代码通过此用户子程序嵌

Home

入到ABAQUS中。

例2.新建一个与JOB名相同但扩展名(.ALE)不同的文件,此用户子程序用到了GETENVVAR应用程序来获得ABAQUS的环境变量,用DMKNAME子程序来合成所需的文件名。

SUBROUTINE UEXTERNALDB(LOP,LRSTART,TIME,DTIME,KSTEP,KINC) INCLUDE 'ABA_PARAM.INC'

CHARACTER XINDIR*255,XFNAME*80 CHARACTER DMKNAME*255,FNAMEX*80 C

LXFNAME=0 LXINDIR=0 XFNAME =' ' XINDIR =' '

CALL GETENVVAR('FNAME',XFNAME,LXFNAME) !读取input文件名

CALL GETENVVAR ('OUTDIR',XINDIR,LXINDIR) !读取input文件所在的路径 IF(LOP.EQ.0) THEN

FNAMEX=DMKNAME(XFNAME(1:LXFNAME),XINDIR(1:LXINDIR), '.ALE') !生成所要新建文件的文件名

OPEN(UNIT=17,FILE=FNAMEX,STATUS='UNKNOWN',FORM='FORMATTED') !打开文件

WRITE(17,*)'Opening new user external file...' WRITE(17,*)'Writing dummy data to this file...' END IF RETURN END c

C COMPOSE A FILENAME DIRECTORY/JOBNAME.EXTEN

CHARACTER*(*) FUNCTION DMKNAME(FNAME,DNAME,EXTEN) C

CHARACTER*(*) FNAME,DNAME,EXTEN C FNAME I JOBNAME C DNAME I DIRECTORY C EXTEN I EXTENSION

C DMKNAME O DIRECTORY/JOBNAME.EXTEN LTOT = LEN(FNAME) LF = 0

DO K1 = LTOT,2,-1

Home

IF (LF.EQ.0.AND.FNAME(K1:K1).NE.' ') LF = K1 END DO

LTOT = LEN(DNAME) LD = 0

DO K1 = LTOT,2,-1

IF (LD.EQ.0.AND.DNAME(K1:K1).NE.' ') LD = K1 END DO

LTOT = LEN(EXTEN) LE = 0

DO K1 = LTOT,2,-1

IF (LE.EQ.0.AND.EXTEN(K1:K1).NE.' ') LE = K1 END DO

IF ((LF + LD + LE) .LE. LEN(DMKNAME)) THEN DMKNAME = DNAME(1:LD)//FNAME(1:LF) LTOT = LD + LF IF ( LE.GT.0) THEN

DMKNAME = DMKNAME(1:LTOT)//EXTEN(1:LE) END IF END IF C

RETURN END

三.SUBROUTINE URDFIL (LSTOP,LOVRWRT,KSTEP,KINC,DTIME,TIME) 参数:

1. LSTOP是决定ABAQUS分析是否继续的开关。如果LSTOP=1,分析中止;否则,分析继续。

2. LOVRWRT是决定能否把上个INCREMENT的结果文件覆盖的开关。LOVRWRT=1,覆盖,这样可大大减少结果文件的大小;否则,不覆盖。 3. LSTEP和LOVRWRT参数是留给用户自己定义的,

KSTEP,KINC,DTIME,TIME是ABAQUS传给用户子程序的参数。 功能:

1. 读结果文件(.FIL)中的数据。

2. 利用LSTOP开关,用户可中止ABAQUS计算

URDFIL要用到以下两个ABAQUS应用程序:POSFIL和DBFILE CALL POSFIL (NSTEP,NINC,ARRAY,JRCD)

Home

参数:

1. NSTEP和NINC的值都是由调用它的URDFIL用户子程序接口中的参数KSTEP和KINC传递下来。

2. ARRAY是用来存放RECORD 2000的值

3. JRCD为返回值。如果在结果文件中找到相应的STEP和INCREMENT,返回值

为0;否则为1。 功能:

如果用户想要对某个STEP中的某个INCREMENT的结果数据进行操作,

POSFIL可定位用户想要进行操作的STEP和INCREMENT数据在结果文件中的位置。

CALL DBFILE (LOP,ARRAY,JRCD) 参数:

1.LOP是用户自己定义的参数。LOP设为0表示继续读下一条记录;LOP设为2表示文件已读到结尾后,又从头开始读起。

2.ARRAY是用来存放从结果文件中读到的那条记录的数组。要用户注意的是ARRAY数组的大小要能存放一条记录。

3. JRCD是返回值,如果读到文件结尾,返回值为非0的整数。 功能:

读取结果文件中的一条记录。

如果想要熟练运用SUBROUTINE URDFIL,那么用户必须对结果文件(.FIL)的格式有所了解。

要让ABAQUS输出结果文件,用户必须在INPUT文件或KEYWORD中加入*EL FILE或着*EL NODE。有些数据是ABAQUS自动写道结果文件中的,如ABAQUS的版本号,节点编号和节点坐标;有些是用户用*EL FILE或着*EL NODE定义的,比如应力、应变、节点位移等等。

结果文件存放的是一条条的记录。为了区别不同的记录集,记录中有一项为RECORD KEY。不同的记录集,RECORD KEY是不同的。比如节点坐标的记录集

Home

(COORD)的RECORD KEY 为8;主应力(EP)的RECORD KEY为403;用户可根据不同的RECORD KEY来分辨不同的记录集。每条记录包括好多个数据。每个记录是以*I开头,数据中的实数是以D开头,输出格式为E22.15 or D22.15;整数是以I开头,接着的数字为这个整数的位数,然后才是整数的值。字符数据以A开头。

比如记录 *I 18I 41900I 15AS4R I 3195I 3198I 3205I 3204 这条记录第一项18表示这条记录一共有8个数据,1为8的位数;第二项为RECORD KEY其值为1900,前面的4为1900的位数。第三项5表示是此单元编号,第四项S4R表示单元类型,剩余四项表示此单元四个节点的编号。

例3:此程序是把结果文件中的每个节点的编号、坐标、速度和位移写到文件F3.DAT

SUBROUTINE URDFIL(LSTOP,LOVRWRT,KSTEP,KINC,DTIME,TIME) C

INCLUDE 'ABA_PARAM.INC' C

DIMENSION ARRAY(513),JRRAY(NPRECD,513),TIME(2),LRUNIT(2,1) 1,COORD(3)

EQUIVALENCE (ARRAY(1),JRRAY(1,1))

CALL POSFIL(KSTEP,KINC,ARRAY,JRCD) !定位到当前的STEP和INCREMENT

OPEN(UNIT=17,FILE='G:\\TEMP\\F3.DAT') !打开文件

WRITE(17,*)KINC,KSTEP !把当前的STEP和INCREMENT输出到文件 DO 1000 K2=1,10 DO 100 K1=1,99999 C

CALLDBFILE(0,ARRAY,JRCD) !读入一条记录 IF(JRCD.NE.0)GOTO 110 !判断结果文件是否结束 KEY=JRRAY(1,2) !把RECORD KEY赋值于KEY C

IF(KEY.EQ.107) THEN !判断此条记录是否为节点坐标 KEL=JRRAY(1,3)

COORD(1)=ARRAY(4) COORD(2)=ARRAY(5) COORD(3)=ARRAY(6)

WRITE(17,120) KEL,COORD(1),COORD(2),COORD(3) !输出节点编号,坐标 120 FORMAT(5X,'NODE',I5,5X,'COORD',F20.14,5X,F20.14,5X,F20.14,5X) ELSE IF(KEY.EQ.101)THEN !判断此条记录是否为位移 KEL=JRRAY(1,3)

Home

COORD(1)=ARRAY(4) COORD(2)=ARRAY(5) COORD(3)=ARRAY(6)

WRITE(17,140) KEL,COORD(1),COORD(2),COORD(3)!输出节点编号,位移 140 FORMAT(5X,'NODE',I5,5X,'UCOORD',F20.14,5X,F20.14,5X,F20.14,5X) ELSE IF(KEY.EQ.102)THEN !判断此条记录是否为速度

WRITE(17,130) ARRAY(3),ARRAY(4),ARRAY(5),ARRAY(6),ARRAY(7), 1 ARRAY(8),ARRAY(9) !输出节点编号,速度

130 FORMAT(5X,'NODE',I5,5X,'VELOVITY',F20.10,5X,F20.10,5X,F20.10,5X 1 ,F20.10,5X,F20.10,5X,F20.10,5X) END IF C

100 CONTINUE 1000 CONTINUE 110 CONTINUE

CLOSE(17) !关闭文件 RETURN END__

OPEN(UNIT=17,FILE='G:\\TEMP\\F3.DAT') !打开文件

WRITE(17,*)KINC,KSTEP !把当前的STEP和INCREMENT输出到文件 DO 1000 K2=1,10 DO 100 K1=1,99999 C

CALLDBFILE(0,ARRAY,JRCD) !读入一条记录 IF(JRCD.NE.0)GOTO 110 !判断结果文件是否结束 KEY=JRRAY(1,2) !把RECORD KEY赋值于KEY C

IF(KEY.EQ.107) THEN !判断此条记录是否为节点坐标 KEL=JRRAY(1,3)

COORD(1)=ARRAY(4) COORD(2)=ARRAY(5) COORD(3)=ARRAY(6)

WRITE(17,120) KEL,COORD(1),COORD(2),COORD(3) !输出节点编号,坐标 120 FORMAT(5X,'NODE',I5,5X,'COORD',F20.14,5X,F20.14,5X,F20.14,5X) ELSE IF(KEY.EQ.101)THEN !判断此条记录是否为位移 KEL=JRRAY(1,3)

Home

COORD(1)=ARRAY(4) COORD(2)=ARRAY(5) COORD(3)=ARRAY(6)

WRITE(17,140) KEL,COORD(1),COORD(2),COORD(3)!输出节点编号,位移 140 FORMAT(5X,'NODE',I5,5X,'UCOORD',F20.14,5X,F20.14,5X,F20.14,5X) ELSE IF(KEY.EQ.102)THEN !判断此条记录是否为速度

WRITE(17,130) ARRAY(3),ARRAY(4),ARRAY(5),ARRAY(6),ARRAY(7), 1 ARRAY(8),ARRAY(9) !输出节点编号,速度

130 FORMAT(5X,'NODE',I5,5X,'VELOVITY',F20.10,5X,F20.10,5X,F20.10,5X 1 ,F20.10,5X,F20.10,5X,F20.10,5X) END IF C

100 CONTINUE 1000 CONTINUE 110 CONTINUE

CLOSE(17) !关闭文件 RETURN END__

本文来源:https://www.bwwdw.com/article/7i9r.html

Top