概述

ABAQUS提供了相当丰富的单元类型,材料属性等数据库可供用户选择,但是工程问题是千变万化的,为了满足用户的特殊工程要求,ABAQUS为用户提供了强大而又灵活的用户子程序接口(USER SUBROUTINE)和应用程序接口(UTILITY ROUTINE)。用户可以利用子程序接口来编写自己想要实现的特殊功能,以此扩展ABAQUS的功能。ABAQUS 为用户提供了强大而又灵活的用户子程序接口(USER SUBROUTINE)和应用程序接口(UTILITY ROUTINE)。ABAQUS 6.2.5 一共有 42 个用户子程序接口,13 个应用程序接口,用户可以定义包括边界条件、荷载条件、接触条件、材料特性以及利用用户子程序和其它应用软件进行数据交换等等。这些用户子程序接口使用户解决一些问题时有很大的灵活性,同时大大的扩充了 ABAQUS 的功能。例如:如果荷载条件是时间的函数,这在 ABAQUS/CAE 和 INPUT 文件中是难以实现的,但在用户子程序 DLOAD 中就很容易实现。用户自定义子程序(User Subroutine)涵盖了建模、载荷到单元的几乎各个部分。

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

编写子程序要注意的事项

  • 用户子程序不能嵌套。即任何用户子程序都不能调用任何其他用户子程序,但可以调用用户自己编写的FORTRAN子程序和ABAQUS应用程序。当用户编写FORTRAN子程序时,建议子程序名以F开头,以免和ABAQUS内部程序冲突。
  • 当用户子程序中利用OPEN打开外部文件时,要注意以下两点:一是设备号的选用是有限制的,只能取15-18和大于100的设备号。二是用户需提供外部文件的绝对路径而不是相对路径。

    -ABAQUS应用程序必须由用户子程序调用。当用到某个用户子程序时,要关心的主要由两个方面:

    • 一是ABQUS提供的用户子程序的接口参数。有些参数是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)

参数:

  • F 为用户定义的是每个积分点所作用的荷载的大小;
  • KSTEP,KINC 为 ABAQUS 传到用户子程序当前的 STEP 和 INCREMENT 值;
  • TIME(1),TIME(2)为当前 STEP TIME 和 INCREMENT TIME 的值;
  • NOEL,NPT 为积分点所在单元的编号和积分点的编号;
  • COORDS 为当前积分点的坐标;
  • 除 F 外,所有参数的值都是 ABAQUS 传到用户子程序中的。

功能:

  • 荷载可以被定义为积分点坐标、时间、单元编号和单元节点编号的函数。
  • 用户可以从其他程序的结果文件中进行相关操作来定义积分点 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

B. 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 扩充功能的程序代码通过此用户子程序嵌入到 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
IF (LF.EQ.0.AND.FNAME(K1:K1).NE.' ') LF = K1 Home
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)

参数:

  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 中加入ELFILE 或着ELNODE。有些数据是 ABAQUS 自动写道结果文件中的,如 ABAQUS 的版- 号,节点编号和节点坐标;有些是用户用ELFILE 或着ELNODE定义的,比如应力、应变、节点位移等等。结果文件存放的是一条条的记录。为了区别不同的记录集,记录中有一项为RECORD KEY。不同的记录集,RECORD KEY 是不同的。比如节点坐标的记录集

(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
CALL DBFILE(0,ARRAY,JRCD) !读入一条记录
IF(JRCD.NE.0)GO TO 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)
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

ABAQUS学习记录1——用户子程序综述的更多相关文章

  1. Abaqus用户子程序umat的学习

    Abaqus用户子程序umat的学习 说明:在文件中,!后面的内容为注释内容.本文为学习心得,很多注释是自己摸索得到.如有不正确的地方,敬请指正. ! ------------------------ ...

  2. ABAQUS用户子程序一览表

    说明 ABAQUS用户子程序一览表 ABAQUSStandard subroutines Refence 说明 本系列文章本人基本没有原创贡献,都是在学习过程中找到的相关书籍和教程相关内容的汇总和梳理 ...

  3. V4L2学习记录【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637600.html V4L2学习记录 这个还没有分析完,先在这放着,防止电脑坏掉丢了,以后再完善 V4L ...

  4. Python学习记录day7

    目录 Python学习记录day7 1. 面向过程 VS 面向对象 编程范式 2. 面向对象特性 3. 类的定义.构造函数和公有属性 4. 类的析构函数 5. 类的继承 6. 经典类vs新式类 7. ...

  5. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  6. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  7. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  8. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  9. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

随机推荐

  1. javascript的回调函数

    函数也是对象 想弄明白回调函数,首先的清楚地明白函数的规则.在javascript中,函数是比较奇怪的,但它确确实实是对象.确切地说,函数是用Function()构造函数创建的Function对象.F ...

  2. Django学习:ORM

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  3. IO流案例:1.复制多级文件夹 2.删除多级文件夹

    package copy; /* 需求:复制多级文件夹 复制d:\\itcast(包含文件和子文件夹)到模块目录下 分析: d:\\itcast a.txt b.txt javaweb a.xml b ...

  4. the little schemer 笔记(8)

    第八章 lambda the ultimate 还记得我们第五章末的rember和insertL吗 我们用equal?替换了eq? 你能用你eq?或者equal?写一个函数rember-f吗 还不能, ...

  5. new delete 创建回收细节

  6. Hdu 1043 Eight (八数码问题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1043 题目描述: 3*3的格子,填有1到8,8个数字,还有一个x,x可以上下左右移动,问最终能否移动 ...

  7. 2015 ACM-ICPC国际大学生程序设计竞赛北京赛区网络赛 1002 Mission Impossible 6

    题目链接: #1228 : Mission Impossible 6 解题思路: 认真读题,细心模拟,注意细节,就没有什么咯!写这个题解就是想记录一下rope的用法,以后忘记方便复习. rope(块状 ...

  8. Hdu 5442 Favorite Donut (2015 ACM/ICPC Asia Regional Changchun Online 最大最小表示法 + KMP)

    题目链接: Hdu 5442 Favorite Donut 题目描述: 给出一个文本串,找出顺时针或者逆时针循环旋转后,字典序最大的那个字符串,字典序最大的字符串如果有多个,就输出下标最小的那个,如果 ...

  9. CH#56C(LCA+dfs序)

    题目传送门 性质是:把节点dfs序以后,异象石按这个序号排序,然后相邻两两求树上距离,这些距离的和除以二就是最小斯坦纳树. 插入删除的具体操作是根据我们上述性质,用一个set维护dfn,比如插入x,则 ...

  10. Reduce实现

    Reduce实现 参考 第一版 Array.prototype.fakeReduce = function (fn, base) { // this 指向原数组 // 拷贝数据, 更改指针方向 var ...