abaqus_用户程序学习心得_abaqus用户子程序
abaqus_用户程序学习心得由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“abaqus用户子程序”。
ABAQUS用户子程序
当用到某个用户子程序时,用户所关心的主要有两方面:一是ABAQUS提供的用户子程序的接口参数。有些参数是ABAQUS传到用户子程序中的,例如SUBROUTINE DLOAD中的KSTEP,KINC,COORDS;有些是需要用户自己定义的,例如F。二是ABAQUS何时调用该用户子程序,对于不同的用户子程序ABAQUS调用的时间是不同的。有些是在每个STEP的开始,有的是STEP结尾,有的是在每个INCREMENT的开始等等。当ABAQUS调用用户子程序是,都会把当前的STEP和INCREMENT利用用户子程序的两个实参KSTEP和KINC传给用户子程序,用户可编个小程序把它们输出到外部文件中,这样对ABAQUS何时调用该用户子程序就会有更深的了解。(子程序中很重要的就是要知道由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. 荷载可以被定义为积分点坐标、时间、单元编号和单元节点编号的函数。
2. 用户可以从其他程序的结果文件中进行相关操作来定义积分点F的大小。
例1:这个例子在每个积分点施加的荷载不仅是坐标的函数,而且是随STEP变化而变化的。
SUBROUTINE DLOAD(P,KSTEP,KINC,TIME,NOEL,NPT,LAYER,KSPT,COORDS, 1 JLTYP,SNAME)INCLUDE 'ABA_PARAM.INC' C DIMENSION TIME(2),COORDS(3)CHARACTER*80 SNAME
PARAMETER(PLOAD=100.E4)
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
UMAT 子程序具有强大的功能,使用UMAT 子程序:
(1)
可以定义材料的本构关系,使用ABAQUS 材料库中没有包含的材料进行计算,扩充程序功能。(2)几乎可以用于力学行为分析的任何分析过程,几乎可以把用户材料属性赋予ABAQUS 中的任何单元;(3)必须在UMAT 中提供材料本构模型的雅可比(Jacobian)矩阵,即应力增量对应变增量的变化率。
(4)可以和用户子程序“USDFLD”联合使用,通过“USDFLD”重新定义单元每一物质点上传递到UMAT 中场变量的数值。
由于主程序与UMAT 之间存在数据传递,甚至共用一些变量,因此必须遵守有关UMAT 的书写格式,UMAT 中常用的变量在文件开头予以定义,通常格式为:
SUBROUTINE UMAT(STRESS,STATEV,DDSDDE,SSE,SPD,SCD, 1 RPL,DDSDDT,DRPLDE,DRPLDT, 2 STRAN,DSTRAN,TIME,DTIME,TEMP,DTEMP,PREDEF,DPRED,CMNAME, 3 NDI,NSHR,NTENS,NSTATV,PROPS,NPROPS,COORDS,DROT,PNEWDT, 4 CELENT,DFGRD0,DFGRD1,NOEL,NPT,LAYER,KSPT,KSTEP,KINC)
INCLUDE 'ABA_PARAM.INC'
CHARACTER*80 CMNAME DIMENSION STRESS(NTENS),STATEV(NSTATV), 1 DDSDDE(NTENS,NTENS),DDSDDT(NTENS),DRPLDE(NTENS), 2 STRAN(NTENS),DSTRAN(NTENS),TIME(2),PREDEF(1),DPRED(1), 3 PROPS(NPROPS),COORDS(3),DROT(3,3),DFGRD0(3,3),DFGRD1(3,3)user coding to define DDSDDE, STRESS, STATEV, SSE, SPD, SCD and, if neceary, RPL, DDSDDT, DRPLDE, DRPLDT, PNEWDT RETURN END UMAT 中的应力矩阵、应变矩阵以及矩阵DDSDDE,DDSDDT,DRPLDE 等,都是直接分量存储在前,剪切分量存储在后。直接分量有NDI 个,剪切分量有NSHR 个。各分量之间的顺序根据单元自由度的不同有一些差异,所以编写UMAT 时要考虑到所使用单元的类别。下面对UMAT 中用到的一些变量进行说明:
DDSDDE(NTENS,NTENS)
是一个NTENS 维的方阵,称作雅可比矩阵,是应力的增量,是应变的增量,DDSDDE(I,J)表示增量步结束时第J 个应变分量的改变引起的第I 个应力分量的变化。通常雅可比是一个对称矩阵,除非在“*USER MATERIAL”语句中加入了“UNSYMM”参数。STRESS(NTENS)
应力张量矩阵,对应NDI 个直接分量和NSHR 个剪切分量。在增量步的开始,应力张量矩阵中的数值通过UMAT 和主程序之间的接口传递到UMAT 中,在增量步的结束UMAT 将对应力张量矩阵更新。对于包含刚体转动的有限应变问题,一个增量步调用UMAT 之前就已经对应力张量的进行了刚体转动,因此在UMAT 中只需处理应力张量的共旋部分。UMAT 中应力张量的度量为柯西(真实)应力。
STATEV(NSTATEV)
用于存储状态变量的矩阵,在增量步开始时将数值传递到UMAT 中。也可在子程序USDFLD或UEXPAN 中先更新数据,然后增量步开始时将更新后的数据传递到UMAT 中。在增量步的结束必须更新状态变量矩阵中的数据。和应力张量矩阵不同的是:对于有限应变问题,除了材料本构行为引起的数据更新以外,状 态变量矩阵中的任何矢量或者张量都必须通过旋转来考虑材料的刚体运动。
状态变量矩阵的维数,等于关键字“*DEPVAR”定义的数值。状态变量矩阵的维数通过ABAQUS 输入文件中的关键字“*DEPVAR”定义,关键字下面数据行的数值即为状态变量矩阵的维数。
材料常数的个数,等于关键字“*USER MATERIAL”中“CONSTANTS”常数设定的值。PROPS(NPROPS)
材料常数矩阵,矩阵中元素的数值对应于关键字“*USER MATERIAL”下面的数据行。SSE,SPD,SCD 分别定义每一增量步的弹性应变能,塑性耗散和蠕变耗散。它们对计算结果没有影响,仅仅作为能量输出。其他变量:
STRAN(NTENS):应变矩阵;
DSTRAN(NTENS):应变增量矩阵; DTIME :增量步的时间增量; NDI :直接应力分量的个数; NSHR :剪切应力分量的个数;
NTENS :总应力分量的个数,NTENS NDI NSHR = +。
使用UMAT 时需要注意单元的沙漏控制刚度和横向剪切刚度。通常减缩积分单元的沙漏控制刚度和板、壳、梁单元的横向剪切刚度是通过材料属性中的弹性性质定义的。这些刚度基于材料初始剪切模量的值,通常在材料定义中通过“*ELASTIC”选项定义。但是使用UMAT 的时候,ABAQUS 对程序输入文件进行预处理的时候得不到剪切模量的数值。所以这时候用户必须使用“*HOURGLASS STIFFNESS” 选项来定义具有沙漏模式的单元的沙漏控制刚度,使用“*TRANSVERSE SHEAR STIFFNESS”选项来定义板、壳、梁单元的横向剪切刚度。几个关于子程序的问题及相应解答 Q: 本人在用umat作本构模型时,*static,1,500,0.000001,0.1 此时要求的增量步很多,即每次增量要很小,*static
1,500 时,在弹性向塑性过度时,出现错误,增量过大,出现尖点.? A: YOU CAN TRY AS FOLLOWS:
*STEP,EXTRAPOLATION=NO,INC=2000000 *STATIC
0.001,500.0,0.00001,0.1。
Q: 在abaqus中,如果采用umat,利用自己的本构,如何让abaqus明白这种材料的弹塑性应
变,也就是说,如何让程序返回弹性应变与塑性应变,好在output中输出,我曾想用最笨
地方法,在uvarm中定义输出,利用getvrm获取材料点的值,但无法获取增量应力,材料常
数等,研究了帮助中的例子,umatmst3.inp,umatmst3.for,他采用mises J2 流动理论,我在output history 显示他已进入塑性状态,但他的PE仍然为0!? A: 用uvar()勉强成功。
Q: 偶在umat中调用求主应力函数
CALL SPRINC(STRESS,PS,LSTR,NDI,NSHR)后,存储主应力得数组PS中
各个主应力排列顺序是什么?
PS1>PS2>PS3 ? PS1PS3>PS2 ? A: 第二个。
个人觉得:
umat实现自己的本构没有固定的方法,对于不同的本构有可能必须采用不同的方法。这要
靠自己不断地摸索。有可能一种方法对于简单加载问题还行,但有可能对于复杂问题并不
收敛。最重要一点,就是umat中采用的算法必须consistent.再就是ddsdde必须正确,(如
果采用back_Euler 方法等一些算法,ddsdde错误有时不影响结果(对于简单加载问题没有
影响,能收敛,),但对于复杂问题不收敛。
uptonow,你这个算法对于Mises,hill,J2,J2d等一类的屈服函数是正确的,但具体的本构
还要灵活运用,这我也正学习,正在摸索。
有时,umat需要很强的有限元基础,并且对采用的本构要很熟悉,不要在一颗树上吊死才
好。首先要确认自己的umat没有错误,如果没有,但就是不收敛(在不断减小加载步长的情况下,当然最好对步长不敏感,特别是对于粘弹性,粘塑性,内变量一类的材料,有的本构取决于背应力的计算)。那就应该考虑换一种算法。
一点体会,请大家探讨。
Q: abaqus-uamt的老问题,缺少 'ABA_PARAM.INC'文件 ? A: 在cvf6.5调试时,显示 缺少 'ABA_PARAM.INC'文件!
这个没有任何关系的,这个错误将在ABAQUS调用UMAT的时候自动会找到,仅仅有这个错误
将没有任何影响的。也就是说,ABAQUS中调用的时候,实际并不存在这个错误。FT,忘了
说一句了,你把ABA_PARAM.INC.dp或ABA_PARAM.INC.sp拷到你的程序工作空间后,应该将
把ABA_PARAM.INC.dp或ABA_PARAM.INC.sp的后缀.sp或.dp去掉,即将ABA_PARAM.IN C.dp或
ABA_PARAM.INC.sp改名为ABA_PARAM.INC。呵呵,他的意思是在Visual Fortran中调试其子程序,我觉得这是一个好办法,我当时也
是这麽办的,毕竟在ABAQUS中调试是非常麻烦的,只有当你的UMAT没有语法或者明显的逻
辑错误,你在ABAQUS中调试才能事半功倍。Q:uvarm可以输出到哪里?.odb可以么?
另外那个strav??就是自己定义用于umat的那个数组里的数可以输出到.odb里么?
A:在umat中,statev是不能用在output中的,statev只是作为一个解的状态变量,说来惭愧,我是在umat中定义peeq,(peeq)的求解一般在弹塑性力学书上有(等效塑性应变),用write()写入一个临时文件,((切记:这个文件unit号不要与abaqus中的重合,因为他有一些系统默认的文件号,))
然后在uvarm中读取,以uvarm输出,因为uvarm可以以odb的形式输出,支持output,field,output,history
Q:在本版看了一个一维固结的例子,其中含有用户子程序,如下
SUBROUTINE UFIELD(FIELD,KFIELD,NSECPT,KSTEP,KINC,TIME,NODE, COORDS,TEMP,DTEMP)
INCLUDE 'ABA_PARAM.INC'
DIMENSION FIELD(NSECPT),TIME(2),COORDS(3),TEMP(NSECPT), DTEMP(NSECPT)
KFIELD=1
FIELD(1)=COORDS(2)
RETURN END
我在VF6.5中进行调试,提示找不到ABA_PARAM.INC 请问大侠这如何解决。
还有我因为是初次接触用户子程序,我查阅了本版所有的相关贴子,都讲的不太详细,我将问题总结一下,大侠们能不能详细的讲解一下,子程序格式(程序后缀是.f;.f90;.for;.obj??)2 CAE中如何调用,command下如何调用?若有多个子程序同时存在,如何处理 我对VF不是很熟,是否可以用VC,C++编写子程序? A: 若要在vf中调试,那么应该根据需要把SITE文件夹中的ABA_PARAM_DP.INC(双精度)或ABA_PARAM_SP.INC(单精度)拷到相应的位置,并改名为ABA_PARAM.INC即可。
1。我试过,.for格是应该是不可以的,至少6.2和6.3版本应该是不行,其他的没用过,没有发言权。
在Abaqus中,运行abaqus j=jobname user=username时,默认的用户子程序后缀名是.for(.f,.f90应该都不行的,手册上也有讲过),只有在username.for文件没有找到的情况下,才会去搜索username.obj,如果两者都没有,就会报错误信息。
如果username包括扩展名for或obj,那么就根据各自的扩展名ABAQUS会自动选择进行操作。
2。cae中在creat job的job manager中的general中可以指定子程序;command下用命令:abaqus j=jobname user=userfilename(无后缀);
3。将其写在一个文件中即可,然后用一个总的子程序调用(具体参见手册)
4。据说6.4的将可以,6.3的你可以尝试着将VC,C++程序编译为obj文件,没试过。
在你的工作目录下应该已经存在ufield.obj和uvarm.obj这两个文件(这两个文件应该是你分别单独调试ufield.FOR和uvarm.FOR时自动编译生成的,你可以将他们删掉试试看),但是由于你的FOR文件中已经有了UVARM和UFIELD这两个subroutine,显然会造成重复定义,请查实。
## Q: 假定采用mises屈服准则。在调用UMAT之前,ABAQUS传递给UMAT本次增量开始时的应力sigma(0),总应变E,应变增
量delta(E)。
状态变量保存:弹性应变,塑性应变,等效塑性应变。
(请问,状态变量保存的弹性应变+塑性应变是否等于ABAQUS传递给UMAT的总应变???
??)
2,然后在UMAT中利用上述的ABAQUS传递的量和状态变量得到DDSDDE矩阵,然后返回给
ABAQUS,ABAQUS根据delta(sigma)=ddsdde*delta(E),并且得到本次增量结束时的应力
sigma(1)=sigma(0)+delta(sigma)=sigma(0)+ddsdde*delta(E)然后更新本次增量结束时的状态变量:弹性应变,塑性应变,等效塑性应变以供下次调
用UMAT
请问手册上UMAT必须更新应力,可是根据上述我的理解好像是ABAQUS根据UMAT提供的本
次增量的DDSDDE在ABAQUS中更新,请问到底是怎么回事?谢谢!
##### A: 1 在调用UMAT之前,ABAQUS传递给UMAT本次增量开始时的应力sigma(0),总应变E,应..: 量delta(E)。
: 状态变量保存:弹性应变,塑性应变,等效塑性应变。
2,然后在UMAT中利用上述的ABAQUS传递的量和状态变量得到DDSDDE矩阵,然后返回给
: ABAQUS,ABAQUS根据delta(sigma)=ddsdde*delta(E),并且得到本次增量结束时的应力然后更新本次增量结束时的状态变量:弹性应变,塑性应变,等效塑性应变以供下 以上有些answers本人并没有亲自证实,如有问题请及时更正!
转】ABAQUS与FORTRAN 2 2011年10月29日 星期六 10:38 转载自 nefutumu 最终编辑 nefutumu Q: 本人尝试使用ABAQUS的子程序SUBROUTINE,根据帮助文件需要编译通过生成*.for和*.lib文件,可是编译的时候出现错误:Error: Cannot open include file 'ABA_PARAM.INC'不知道是什么原因,怎么解决?
A: 1.确认Visual Fortran及VC++正确安装,并在安装ABAQUS之前安装。2.首先将用户子程序*.f文件后缀名改为*.for。
3.到控制面板-》系统-》高级-》环境变量中的 Administrator用户变量: 修改—— 变量名:lib变量值:C:Program FilesMicrosoft Visual StudioDF98LIB;C:Program FilesMicrosoft Visual StudioVC98LIB(我的问题就是因为只加了一个LIB,必须两个都加!)完成以上步骤以后,就可以运行了。
Q: 怎样把自己编写的子程序倒入到*.INP文件中。
A:
Q:用函数作批处理遇到问题,在fortran中使用result = systemqq(abaqus job=job1 interactive)作批处理,总是在计算两个job之后就不继续往下算了,cmd明令行提示:run time error:floating-point...请问这是怎么回事?
A: 个方法就是做一个批处理文件,abaqus job=beam interactive abaqus job=beam1 interactive abaqus job=beam2 interactive abaqus job=beam n? interactive 存为.bat文件即可。python好像一般是做CAE前后处理界面的。
A:前面加call.call abaqus job=1 interactive call abaqus job=2 interactive call abaqus job=3 interactive
Q:FORTRAN如何调用ABAQUS?
A: use the function “system” or “systemqq” USE DFLIB
LOGICAL(4)result
result = SYSTEMQQ('abaqus job=xx')
QA: 首先我用ABAQUS的VARIFY命令对系统进行修正和检测,这个命令会自动运行,对ABAQUS进行调试等操作,其中涉及到对用户子程序的模拟计算,如果计算失败,就会在VARIFY.LOG文件中说明,确实发现“USER SUBROUTINE...和SINGLE...和DOUBLE...”失败,说明用户子程序安装不成功,肯定与VISUAL FORTRAN6.5有关!然后,找到FORTRAN_MAKE文本文件,发现错误,可能是与FORTRAN安装有关!于是卸载FORTRAN,重新安装在C盘!安装完毕后,改变环境变量如下:
INCLUDE C:Program FilesMicrosoft Visual StudioDF98IMSLINCLUDE;C:Program FilesMicrosoft Visual StudioVC98INCLUDE;D:程序文件VC98INCLUDE;LIB C:Program FilesMicrosoft Visual StudioDF98IMSLLIB;C:Program FilesMicrosoft Visual StudioDF98LIB;C:Program FilesMicrosoft Visual StudioVC98LIB;D:程序文件VC98LIB;PATH C:Program FilesMicrosoft Visual StudioCommonTools;D:程序文件VC98BIN;%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;C:KAV6;D:程序文件KV6;c:program filesmicrosoft visual studiodf98bin;c:program filesmicrosoft visual studiovc98bin;c:program filesmicrosoft visual studiocommonmsdev98bin;D:ABAQUSCommands;C:Program FilesMicrosoft Visual StudioDF98BIN 我们只需要关注MICROSOFT VISUAL STUDIO文件夹!最后,再次执行VARIFY命令,等运行完毕后,检查VARIFY文本文件,发现: ABAQUS/Standard with User Subroutines...PASS Continuing...ABAQUS/Explicit with User Subroutines(single precision)...PASS Continuing...ABAQUS/Explicit with User Subroutines(double precision)...PASS Continuing...OK!!!!!!!!!搞定 ABAQUS神功修炼
2011年10月05日 星期三 15:23 转载自 小强乐了 最终编辑 小强乐了
第1招:abaqus中ELGEN参数的意义
*ELGEN,ELSET=ALLE!?)q/ w, A+ z)w)g, L 1,6,40,1,10,1,10 101,18,40,1,12,1,205 L+ r6 i6 Y* i)j 请问这几句什么意思呢,我查了关键词,但还是不明白
1,6,40,1,10,1,10 对应的分别是:主单元编号、第一行要生成的单元数、单元与单元间对应节点的增量、行中单元编号的增量、要定义的行数、行与行间对应节点的增量、行与行间对应单元编号的增量
第2招:inp文件导入时,出现“WARNING: The following keywords/parameters are not yet supported by the input file reader:”
出现上面的错误,是因为CAE不支持的原因。应该先导入CAE中,然后编辑它的关键字,在里面把原来要加的初始化条件手工加进去。具体操作是: model->edit keywords 注意 edit keywords 导入的任何数据在cae中是看不到的比如:在edit keywords里定义了材料弹性模量 E,在cae里的材料设置中是看不到的 edit keywords 中与cae的定义如果出现冲突 会错误提示 所以要慎用
第3招:abaqus中的一个findAt技巧
seion.journalOptions.setValues(replayGeometry=COORDINATE,recoverGeometry=COORDINATE)在命令行中直接输入上述语句
结果.rpy文件中的findAt语句就会以坐标形式出现
seion.graphicsOptions.setValues(backgroundStyle=SOLID,backgroundColor='#000000', translucencyMode=2)在命令行中直接输入上述语句 背景颜色就会变成黑色
第4招:查看abaqus对应的python版本
在abaqus command里输入
abaqus python
第5招:在abaqus中子程序的编译
一般来说abaqus的源文件的编译需要使用命令,abaqus make library=usersubroutine.f, 这样生成的*.o文件才能被成功调用。或者是命令:在abaqus command中输入:abaqus make-library subroutine