[2]ansys的upfs二次开发概述与算例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

*** 用户可编程特性 (UPFs) ***
ANSYS程序的开放结构允许用户连接自己的FORTRAN程序和子过程。

实际上,现在用
户看到的许多ANSYS“标准”用法都是由以前用户过程引进的。

1.1 什么是UPFs?
用户可编程特性是ANSYS的功能允许用户使用自己的FORTRAN程序。

UPFs适用于ANSYS/Multiphysics, ANSYS/Mechanical, ANSYS/Structural, ANSYS/PrepPost和ANSYS/University(研究版和大学版)产品系列。

UPFs允许用户根据需要定制ANSYS程序,如用户定义的材料性质,用户单元类型,用
户定义的失效准则等。

用户还可以编写自己的优化设计算法将整个ANSYS程序作为子过程
来调用。

注意:用户使用UPFs必须十分小心仔细。

通过连接自己的FORTRAN程序,用户生成
了一个针对用户特定计算机的ANSYS程序版本。

在并行系统中使用ANSYS时不允许使用用
户可编程特性。

另外,UPFs是一种非标准的使用方法,ANSYS公司质量保证的测试程序没
有包括这部分内容。

用户必须负责保证用户子程序结果正确并不影响别的标准功能的运行。

1.2 如何使用UPFs?
UPFs可以从简单的单元输出功能到很复杂的用户单元或用户优化算法。

因此,不进行
特定的程序细节描述是很难完成这些子程序功能的。

在Programmer's Manual for ANSYS中
有详细的解释。

一个典型的UPF包括下列步骤:
1). 在FORTRAN77中编制用户程序。

在ANSYS中所有的用户程序源代码都是公开的。

大部分完成至少一个简单的功能,因此在编制程序前应列出一份完整的可用程序表。

2). 编译并将用户程序连接到ANSYS程序中,生成新版本的ANSYS。

3). 用户可能要验证自己做的改动是否影响其他ANSYS标准功能的使用。

可以通过做
几个ANSYS Verification Manual中的例题来验证。

在ANSYS中也有输入这些问题的方法。

4). 用户子程序的调用
ANSYS程序将在用户使用时自动激活一些子程序,如用户单元等。

例如,要激活一个
用户单元,仅仅在模型建立时指定它为其中的一个单元类型(ET命令),将单元类型属性指
针设置好,然后用该单元进行实体划分[AMESH,VMESH等]或直接生成单元[E等命令]即可。

对于其他一些UPFs,用户需要做一些别的操作来激活它们,如USRCAL命令。

如果没
有做这一步,将执行标准的ANSYS功能。

例如,如果想施加对流载荷,即便连接了用户对
流子程序,缺省时仍是使用标准的ANSYS功能。

因此用户必须使用USRCAL命令(或相应
路径)激活正确的用户子程序才能使用用户过程。

请参阅USRCAL命令描述得到命令可以影
响的用户过程列表。

另一个有用的命令是/UCMD,可以使用户在用户过程之外生成自己的命令。

(/UCMD命
令无GUI路径。

)假定用户连接抛物线形分布压力的子程序。

如果子程序名为USERnn(nn=1
到10),可以用自己的命令调用程序:
/UCMD,PARAB,1
PARAB将成为合法的ANSYS命令,用来调用用户子程序USER01。

可以用命令调用10
个子程序。

1.3 当前UPFs简介
1). 用户单元: 用户可以写单元类型添加到ANSYS单元库中,并象标准单元一样使用。

可以定义不超过六个用户单元类型(USER100-USER105)。

在ANSYS用户子程序示例中有结构质量单元MASS21和三维杆单元LINK8的程序实例。

2). 用户单元坐标系定位: 用于下列单元类型:SHELL43, SHELL63, SHELL91, SHELL93, SHELL99, SHELL181, SOLID46, SOLID64。

而对于分层的单元(SOLID46,SHELL91,SHELL99),可以定义层的坐标系方位。

3). 用户实参:单元COMBIN7和COMBIN37允许输入的实参在用户自己的非线性功能中被修改。

4). 用户摩擦系数:适用于接触单元CONTAC48和CONTAC49。

5). 用户塑性屈服准则:允许用户定义自己的塑性准则,计算塑性应变并在积分点处生成切向应力-应变矩阵。

6). 用户蠕变方程:允许用户定义自己的蠕变方程。

7). 用户熔涨准则:如果在分析中计入熔涨(如中子爆炸),可以定义合适的熔涨准则。

在ANSYS程序中没有内部的熔涨准则。

8). 用户湿热生成:允许计入由潮湿成分引起的热膨胀,限于SHELL91单元。

9). 用户超弹性:适用于超弹性单元HYPER56,HYPER58,HYPER74,HYPER158。

10). 用户失效准则:适用于层单元SOLID46和SHELL99。

可以定义不超过六个失效准则。

11). 用户粘弹性:对于FLIUD141和FLUID142单元,可以将粘弹性作为压力,温度,位置,时间,速度和速度梯度的函数定义。

12). 用户载荷:体载荷如温度,热生成和频率(如中子流),面载荷如压力,对流,热流和电势密度可以用用户子程序定义。

13). 用户载荷向量:对于PIPE59单元,允许用户生成复数的载荷向量用于频率范围逻辑。

可以用它代表水动力载荷。

14). ANSYS作为子程序:可以在自己的程序中将ANSYS作为子程序调用,如用户子定义的优化算法。

15). 用户优化:可以用自己的算法和中断准则替换ANSYS优化过程。

16). 在每个ANSYS运行求解,载荷步,子步和平衡迭代的开始和结束使得用户介入:允许用户的求解中评估和对结果进行任意运算。

1.4 ANSYS程序的非标准使用
在ANSYS程序推出之前要经过严格的验证。

在“标准”功能的使用中,可以保证用户得到合理的结果。

但是,在一些情况下,用户可能要使用非标准技术。

由于其特殊性,如用户子程序,而未在ANSYS公司经过完整验证。

在这种情况下,用户必须自己验证结果的正确性。

何为非标准使用?
非标准使用ANSYS的结果是无法预知的。

因此,ANSYS公司的质量保证程序并不能完全覆盖这些使用过程。

ANSYS公司不阻止非标准的使用,但用户必须在这种情况下非常注意并分析结果。

例如,在ANSYS中使用用户单元,结果将主要取决于单元的编制方法。

用户必须验证结果并保证不影响程序的其他标准使用功能。

下面列出了一部分ANSYS非标准使用特性:
1). 用户可编程特性:编制用户的子程序,将其连接到ANSYS并在分析中使用。

如前所述。

2). 将在ANSYS程序外编写并编辑的文件或程序读入ANSYS中,如由用户程序生成的结果文件或超单元文件。

下面列出的是一些较危险的使用方法:
1). 在求解器中两个载荷步之间改变单元实参。

这取决于所用单元类型,有些单元在实参变化后会发生问题。

2). 不激活实体模型的交叉参考检查[MODMSH,NOCHECH]
3). 关闭单元形状检查[SHPP,OFF]
4). 使用非公布的特性,如在ANSYS Element reference中未包括的单元选项或在ANSYS Commands Reference未包括的命令。

如果ANSYS程序发现了非标准使用,总会给出警告信息。

在ANSYS程序中使用非标准请参考下列建议:
1). 运用工程经验仔细检验分析结果。

2). 不要假定其他标准过程未被影响,要通过几个考题检验。

3). 如果要获得涉及非标准使用过程的用户支持时,要给出使用的原始和扩展非标准特性。

*** ANSYS UPFS二次开发培训练习题(转帖) ***
1. 编译并连接ANSYS提供的示例程序USER01.F;在ANSYS命令行中使用/UCMD给用户命令赋新的名称,并运行。

2. 编译并连接ANSYS提供的示例程序USER0
3.F,使用动态数组保存有限元模型信息,如节点号、单元号、节点坐标、单元节点列表。

使用UPF读写数据库子程序,读写模型中的有限元模型信息和载荷信息,并打印。

3. 使用ANSYS提供子程序试验矢量与矩阵的操作
4. 试验用户自定义材料
5. 试验用户单元
6. 使用/DEBUG命令调试ANSYS单元矩阵及载荷矢量
1. 用户命令:编译并连接ANSYS提供的示例程序USER01.F;在ANSYS命令行中使用
/UCMD给用户命令赋新的名称,并运行。

1) 编译连接USER01.F生成新的ANSYS
2) 执行用户命令
在图形界面的输入框中,键入命令
usr1
3)用/UCMD命令自定义用户命令名
在ANSYS BEGIN提示信息后
/UCMD,aaa,1
aaa
2. 编译并连接ANSYS提供的示例程序USER0
3.F,使用动态数组保存有限元模型信息,如
节点号、单元号、节点坐标、单元节点列表。

使用UPF读写数据库子程序,读写模型中的有限元模型信息和载荷信息,并打印。

1) 以下是一个完整的程序,可由user03.F修改得到
*deck,user03 user
ANSYS,INC
c si
d 5.1 copy of fil
e er03.F last changed by jtm on 98/03/09 function user03 (intin,dpin,ch4in,ch8in)
#include "impcom.inc"
external wrinqr,ndinqr,ndgxyz,ndnext,HeapAllocPtr,
x HeapDealloc,erhandler
integer wrinqr,ndinqr,ndgxyz,ndnext,HeapAllocPtr
integer user03, intin(12), iott, i, ksel, xcptr, hXcptr, ycptr, x hYcptr, zcptr, hZcptr, ndptr, hNdptr, numnp, node
double precision dpin(12),xyz(3), xmean, ymean, zmean,
stdxyz(3),
x sodx, sody, sodz
character*4 ch4in(12)
character*8 ch8in(12)
#include "ansysdef.inc"
#include "stack.inc"
c
c Get nodal xyz locations an
d calculat
e standard deviation of
c x coordinates, y coordinates, & z coordinates
c
c get number of currently selecte
d nodes
numnp = ndinqr (0,DB_NUMSELECTED)
if (numnp .le. 0) go to 999
c allocate memory for x, y, & z coordinates of nodes
xcptr = HeapAllocPtr(numnp,'XCoords ',HEAP_DOUBLE,hXcptr)
ycptr = HeapAllocPtr(numnp,'YCoords ',HEAP_DOUBLE,hYcptr)
zcptr = HeapAllocPtr(numnp,'ZCoords ',HEAP_DOUBLE,hZcptr)
ndptr = HEapAllocPtr(numnp,'Nodes ',HEAP_INTEGER,hNdptr)
c loop through all selecte
d nodes
i=1
node = 0
xmean = 0.0d0
ymean = 0.0d0
zmean = 0.0d0
10 node = ndnext(node)
if (node .gt. 0) then
c get xyz coordinates
ksel = ndgxyz (node,xyz(1))
c store this node's xyz coordinates
dstack(xcptr + i) = xyz(1)
dstack(ycptr + i) = xyz(2)
dstack(zcptr + i) = xyz(3)
istack(ndptr + i) = node
c while we're looping, accumulate sums to calculate means xmean = xmean + xyz(1)
ymean = ymean + xyz(2)
zmean = zmean + xyz(3)
c increment index
i = i + 1
c loop back up for next selecte
d node
goto 10
endif
call wrdisp (numnp, istack(ndptr+1))
c node = 0, at the en
d of nod
e list
c calculate mean of xyz coordinates
xmean = xmean / numnp
ymean = ymean / numnp
zmean = zmean / numnp
c calculate standar
d deviation for xyz coordinates
sodx = 0
sody = 0
sodz = 0
do i=1, numnp
sodx = sodx + (dstack(xcptr+i) - xmean)**2
sody = sody + (dstack(ycptr+i) - ymean)**2
sodz = sodz + (dstack(zcptr+i) - zmean)**2
enddo
stdxyz(1) = sqrt(sodx / (numnp-1))
stdxyz(2) = sqrt(sody / (numnp-1))
stdxyz(3) = sqrt(sodz / (numnp-1))
c ***** write to output file *****
iott = wrinqr(WR_OUTPUT)
write (iott,2000) stdxyz(1),stdxyz(2),stdxyz(3)
2000 format (/' STD FOR X COORDINATES:',G12.5,/,
X ' STD FOR Y COORDINATES:',G12.5,/,
X ' STD FOR Z COORDINATES:',G12.5)
c ***** write to GUI window *****
call erhandler ('user03',5000,2,
x 'STD FOR X COORDINATES: %G %/ STD FOR Y
x COORDINATES: %G %/ STD FOR Z COORDINATES: %G',stdxyz(1),' ')
c release dynamically allocate
d memory
call HeapDealloc(hXcptr)
call HeapDealloc(hYcptr)
call HeapDealloc(hZcptr)
call HeapDealloc(hNdptr)
c ***** require
d return valu
e *****
999 user03 = 0
return
end
subroutine wrdisp (nnod, nodes)
#include "impcom.inc"
#include "ansysdef.inc"
integer nnod, nodes(nnod)
external wrinqr, disget
integer wrinqr, disget
integer iott,i,rc,k
double precision value(4)
iott = wrinqr(WR_OUTPUT)
do i=1,nnod
rc = disget(nodes(i), 1, value(1))
if (rc .eq. 0) then
write (iott,1000) nodes(i)
1000 format ('Nodes=',i3,' No x displacement constraint') else
write (iott,1010) nodes(i), (value(k), k=1,4)
1010 format ('Nodes=',i3,' UX=',4(F8.2,','))
endif
enddo
return
end
2) 将上面程序编译并连接,生成新的ANSYS 。

启动新版本的ANSYS ,并输入下面的命令流,观察OUTPUT 窗口的输出信息
/prep7
blc4,0,0,4,2
et,1,42
esize,.5
amesh,1
nsel,s,loc,x,4
d,all,ux,8
nsel,s,loc,x,0
d,all,ux,-9
nsel,all
usr3
3. 使用ANSYS 提供子程序试验矢量与矩阵的操作
⎪⎭⎪⎬⎫⎪⎩⎪⎨⎧=765a ⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎣⎡=238549973543b 以下是一个完整的程序用来说明矢量矩阵操作{c}=[b]{a}
1) 以下是一个完整的程序,可由user01.F 修改得到
*deck,user01 user parallel ANSYS,INC
function user01 (intin,dpin,ch4in,ch8in)
#include "impcom.inc"
external wrinqr
integer wrinqr
integer user01,intin(12), iott
double precision dpin(12)
character*4 ch4in(12)
character*8 ch8in(12)
c
double precision a(3), b(4,3), c(4)
integer i,j,k
data a /5,6,7/
data b /3,3,9,8, 4,7,4,3, 5,9,5,2/
iott = wrinqr(2)
call vzero (c(1), 4)
write (iott, *) '*** matrix b ='
do i=1,4
write (iott, 101) (b(i,k), k=1,3)
enddo
write (iott, *) '*** vector a='
do i=1,3
write (iott, 100) a(i)
enddo
call maxv(b(1,1),a(1),c(1), 4,3)
write (iott, *) '*** vector c='
do i=1,4
write (iott, 100) c(i)
enddo
100 format (F9.2, 3x)
101 format (3(F9.2, 3x))
user01 = 0
c
return
end
2) 编译连接USER01.F生成新的ANSYS,执行用户命令。

在图形界面的输入框中,键入命令
usr1
4. 用户自定义材料
1) 拷贝已有用户材料程序userpl.F
2) 编译连接生成新的ANSYS
3) 编辑命令流a.inp
/PREP7
et,1,42
mp,ex,1,2e6
mp,nuxy,1,.3
r,1,100,0
tb,user,1
tbdata,1,100,2e3
blc4,0,0,4,2
esize,.5
type,1
mat,1
real,1
amesh,1
nsel,s,loc,x,0
d,all,all,0
nsel,s,loc,x,4
nsel,r,loc,y,0
f,all,fy,-1000
nsel,all
/solu
antype,static
time,1
solve
4) 运行新版本的ANSYS,导入命令流文件/input,a,inp
5. 用户单元
1) 拷贝已有用户材料程序uec101.F 和 uel101.F
2) 编辑uel101.F
将下面的程序段
c
call TrackBegin ('uel101')
c
c --- define initial data
c --- elmdat pointers define
d in elparm
mat = elmdat(PMAT)
修改为:
c
call TrackBegin ('uel101')
iott=wrinqr(2)
write (iott, *) 'In user element',elem c
c --- define initial data
c --- elmdat pointers define
d in elparm
mat = elmdat(PMAT)
3) 运行编译连接生成新的ANSYS。

4) 编辑命令流文件a.inp
/PREP7
et,1,USER101
mp,ex,1,2e6
mp,nuxy,1,.3
r,1,100,0
k
k,,100,0
l,1,2
esize,10
type,1
mat,1
real,1
lmesh,1
nsel,s,loc,x,0
d,all,all,0
nsel,s,loc,x,100
f,all,fx,1000
nsel,all
/solu
antype,static
time,1
solve
5) 启动新版本的ANSYS
6) 输入命令流/input,a,inp,注意OUTPUT窗口的结果输出并记录
7) 修改命令流文件a.inp,将单元类型换成LINK8,重新分析与前面结果对比
/PREP7
et,1,LINK8
mp,ex,1,2e6
6. 使用/DEBUG命令调试ANSYS单元矩阵及载荷矢量
1) 在ANSYS中以自己最熟悉的单元建立一个有限元模型,然后加载荷、边界条件,
设定求解参数,如Time, Deltime等
2) 在ANSYS Input Box框中输入以下命令
/DEBUG,-3,,,1
3) 求解,键入求解命令
SOLVE
观察OUTPUT窗口的输出
== 第一章。

相关文档
最新文档