AaronSpark 发表于 2005-12-12 00:19

[转帖]二次开发的一些体会

二次开发调试技术

ANSYS的二次开发一直是许多用户所关注的内容。开发的工具大致可以分为
UPF,APDL,UIDI三块。关于后二者的使用,网上虽讨论很多,但缺乏系统整理;
而UPF则资料相对较少,但从使用上说,这部分内容是潜力最大的。
ANSYS虽然功能强大,但不可能做的面面具到,因此掌握以上三种工具是极为必
要的。就那我从事的优化设计而言,ANSYS只提供了几种功能有限的优化算法,解
决不了复杂的工程问题,但通过二次开发,我可以自己开发出算法与ANSYS接口。


在调试用户子程序过程中,可以利用非《ANSYS命令参考手册》某些命令和其它特
性帮助用户提供许多有用的信息。但是,它们仅仅适合于极小问题并只包含较少迭
代求解情况;否则,它们将会输出大量的数据。 下面将详细介绍/TRACK 和
/DEBUG两个命令;另外有两个ANSYS文档没有包含的命令:OUTEQ 与 /NERR。
? 命令OUTEQ,on 能够用于控制所有平衡迭代计算的输出结果。
? 命令/NERR,,,-1 使系统一直报错,并保持程序继续运行。这时,
正常的中断方式有:1) 系统中断; 2) 错误结果。

1、跟踪程序运算逻辑顺序
/TRACK命令:当程序按逻辑顺序进入和离开某些更高级别的子程序时发送一条信息
。子程序的TrackBegin(开始)和TrackEnd(结束)(参看UPFs第六章)一起构成
/TRACK命令的程序跟踪。 然后,按下列格式执行命令:
/TRACK,MonLevel,PrintLevel,SumLevel
其中:MonLevel是时间监视级别;
PrintLevel是进入/退出输出状态开关;
SumLevel是输出累积时间状态开关。
这三个参数可以是0到9之间的任何值(缺省为0)。用户可以使用/TRACK命令查找出
程序中断发生的代码位置。例如,将所有子程序标识为八个级别,以便确定程序进
入与退出它们的时间, 此时用户应当执行的命令为:
/TRACK,,8

2、调试单元与求解
/DEBUG命令能够在输出的许多位置点进行调试。/DEBUG命令具有下列三种调试格式

? 求解(solution)调试格式
? 单元(element)调试格式
? 一般调试格式
(1)求解(solution)调试格式
执行命令:
/DEBUG,-1,F1,F2,F3,F4,F5,F6,F7,F8,F9
参数说明:
F1—1 (输出基本求解结果控制调试结果)
F2—1 (输出使用Newmark常数的瞬态计算调试结果)
2 (输出使用速度与加速度的瞬态计算调试结果)
F3—1 (输出单元矩阵调试结果,包括矩阵与载荷矢量)
2 (输出单元矩阵调试结果,只包括载荷矢量)
3 (输出单元矩阵调试结果,包括矩阵对角元素和载荷矢量)
F4—1 (输出自动时间步长(auto time stepping)调试结果)
F5—1 (输出多物理场调试结果)
F6—1 (输出弧长(arc-length)调试结果)
F7—1 (输出基本Newton-Raphson调试结果)
2 (输出Newton-Raphson调试结果,包括非平衡力或增量位移或每个DOF)
3 (输出Newton-Raphson调试结果,包括施加载荷与每个DOF 上的n-r恢复力)
F8—1,2 (输出位移矢量以及位移指针调试结果)
2 (输出位移矢量以及增量位移调试结果)
3 (输出位移矢量以及接触数据库调试结果)
F9—1 (输出临时程序员调试结果)
(2)单元(element)调试格式
执行命令:
/DEBUG,-3,G1,G2,G3,G4,G5,G6,G7,G8,G9
参数说明:
G1—1 (输出基本单元通过(pass)调试结果)
G2—1 (输出单元位移和坐标调试结果)
G3—1 (输出单元矩阵调试结果,包括矩阵与载荷矢量)
2 (输出单元矩阵调试结果,只包括载荷矢量)
3 (输出单元矩阵调试结果,包括矩阵对角元素和载荷矢量)
G4—1 (输出单元载荷调试结果)
G5—1 (输出单元实常数(real constant)调试结果)
G6—1 (输出单元存储变量(saved variable)调试结果)
G7—1 (输出线性材料特性单元材料特性调试结果)
2 (输出非线性材料特性单元材料特性调试结果)
G8—1,2 (输出塑性单元非线性调试结果)
2 (输出大变形单元非线性调试结果)
3 (输出接触数据库单元非线性调试结果)
G9—1 (输出临时程序员调试结果)
(3)一般调试格式
执行命令:
/DEBUG,H1,H2,,H4,H5
参数说明:
H1—1 (输出文件头纪录(file header record)信息)
2 (输出字符输入行(character))
3 (输出解码输入行(decoded))
H2—1 (输出波前重新排序(wavefront reordering)与单元检查调试结果)
2 (输出网格划分调试结果)
H4—1 (输出节点坐标系转换格式调试结果)
2 (输出位移更新调试结果)
H5—1 (输出pre-单元、单元特性(characteristics)以及单元场载荷调试结果)

前面按照ansys5.5上的蓝本描述了一下如何在2000下用upf进行ansys的二次开发。
ansys本身提供了一个makefile文件,使用该文件会导致如下问题:
1. 找不到df lib中的三个库函数,需要手工拷贝
2. 找不到ansysex.def文件,需要手工拷贝
3. 也是最重要的,每次修改完自己用户单元程序,如uel101.f等时,执行
anscust,系统不能生成新混编成的ansys.exe文件,而是告诉你ansys.exe 还是最
新的,不需要进行重编,最后只好把现有的ansys.exe等删掉后才能重编 以上这些
问题都是由于ansys本身提供的这个makefile不完善造成的,小弟闲暇之余 重新写
了一个makefile.简化了二次开发的过程以user101单元为蓝本)
1. 新建自己的目录,把ansys57/customize/user/intel下的anscust.bat,
uel101.f
uec101.f拷贝到这个目录下,同时把下面我提供的makefile拷贝到该目录下。
2. 直接执行anscust.bat文件,就混编成功。
3. 修改完uel101.f后,直接执行anscust.bat,将重编新的ansys.exe
注:1如果你想恢复最初状态,在该目录下简单执行nmake clean即可
2我写的这个makefile文件里有个DFLIB的宏定义,如果和你的DFLIB路径不一, 请
手工改一下,否则还是无法找到DF LIB里面的三个文件.(其实你可以编辑一下
anscust.bat里面关于LIB宏的重定义,把DFLIB的路径加进入,就没有了这些烦恼
, 呵呵,反正改makefile或者anscust.bat都是一次性的工作,我也是在环境变量
里找不到DF根目录的表述才不得已写了一个宏。)
下面就是我的makefile文件,因为不长,就不提供下载了,直接贴这里#MakeFile used for upf under win2000,you should have installed
#Ansys57&&Visual Studio!
DFLIB=d:\Microsoft Visual Studio\DF98\LIB
ALL : Ansys.exe
CLEAN:
-@erase "*.obj"
-@erase "Ansys.*"
LINK32=link.exe
LINK32_FLAGS=/out:Ansys.exe -map:Ansys.map -debug:none -opt:noref \
-def:"$(ANSYS57_DIR)\custom\user\intel\ansysex.def" \
-machine:i386 -LARGEADDRESSAWARE -subsystem:windows \
-base:0x79000000 -stack:0x1000000 -delayload:ctl3d32.dll \
-delayload:winmm.dll -delayload:ansysb.dll \
-delayload:mnflib.dll \
-nodefaultlib \
"$(DFLIB)\DFCONSOL.lib" "$(DFLIB)\DFPORT.lib" \
"$(DFLIB)\DFORMD.lib" ansys1.lib ansys2.lib \
kernel32.lib advapi32.lib netapi32.lib \
user32.lib gdi32.lib anslibx.lib ansysb.lib \
comdlg32.lib comctl32.lib winspool.lib vfw32.lib \
winmm.lib ctl3d32.lib glu32.lib opengl32.lib \
msvcrt.lib msvcprt.lib mnflib.lib oldnames.lib \
mpr.lib wsock32.lib siappst.lib Delayimp.lib \
htmlhelp.lib lmgr_md.lib lm_new_md.obj \
lmappfil.obj nt_WinAnsys.obj nt_uiloop.obj \
nt_WinGUI.obj nt_WinMain.obj INEXNT.obj \
MATHLIBC.obj elshfn.obj pElData.obj WinAnsys.res \
masscoeFtri.obj mscoef.obj nodf10.obj nodfTri.obj \
nshpderv.obj stcoef.obj stcoefTri.obj thcoef.obj \
thcoefTri.obj Trinshpderv.obj sstiff2d.obj \
sstiff3d.obj amgsolver.obj amg_init.obj \
elcjfill.obj tess_info.obj userlink.obj
LINK32_OBJS= *.obj
Ansys.exe: $(LINK32_OBJS)
$(LINK32) @<<
$(LINK32_FLAGS) $(LINK32_OBJS)

tianxhsd 发表于 2006-3-1 09:33

以后再来看这部分好了!
页: [1]
查看完整版本: [转帖]二次开发的一些体会