找回密码
 注册
Simdroid-非首页
查看: 1251|回复: 10

【转帖】二次开发调试技术,供搞二次开发的同行分享

[复制链接]
发表于 2003-11-6 17:06:49 | 显示全部楼层 |阅读模式 来自 北京
二次开发调试技术,供搞二次开发的同行分享。  
  
在调试用户子程序过程中,可以利用非《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 \  
"$(DFLI\DFCONSOL.lib" "$(DFLI\DFPORT.lib" \  
"$(DFLI\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)

评分

1

查看全部评分

发表于 2004-2-19 17:00:35 | 显示全部楼层 来自 广东广州

回复: 【转帖】二次开发调试技术,供搞二次开发的同行分享

Simdroid开发平台
支持版主:
关键词  ANSYS  二次开发 VB  VC   
  
//VC调用ANSYS80的示例源程序:  
  
//Test.cpp  
#include "stdio.h"  
#include"process.h"  
void main()  
{  
int result;  
printf("Solving...");  
result=system("执安装文件路径名+文件名 -b -p 产品特征码 -i test.txt -o test.out");  
或者  
//::WinExec("执安装文件路径名+文件名 -b -p 产品特征码 -i test.txt -o test.out", SW_SHOWNORMAL);  
printf("Solution finished...");  
}  
  
注意事项:  
一、产品特征代码  
  
产品特征代码在ANSYS帮助电子文档(help>ansys documentation)里可以找到,步骤如下:  
ansys8.0 documentation>ansys,Inc. Licensing Guide>License files&gtroduct Variable Table  
以该表的第一行为例,如果你的ANSYS是multiphysics版本,那么对应的产品特征代码为ane3fl,则:  
result=system("安装文件路径名+文件名 -b -p ane3fll -i test.txt -o test.out");  
  
二、VC执行文件路径写法  
  
第一种:  
但是默认安装路径不可以: "C:\\Program Files\\Ansys Inc\\v80\\ANSYS\\BIN\\INTEL\\ANSYS80.exe"  
我把原文件考到C:\目录下,这样就可以了:"C:\\ANSYS80.exe"  
现在也没搞清为什么。  
  
第二种:  
默认安装路径可以: C:\\Program Files\\Ansys Inc\\v80\\ANSYS\\BIN\\INTEL\\ANSYS80.exe"  
原文件考到C:\目录下,这样也可以:"C:\\ANSYS80.exe"  
  
前两天我刚刚调试通过的,这样就没问题了。  
  
转贴和我交流gengguang的VB例子:
  
是关于由已知的数组求得另外一组数组并在ANSYS中画出KP并生成曲线的的小命令。
Private Sub Command1_Click()
Dim i, i1, j, j0 As Integer
Dim x(1000), y(1000), x1(1000), y1(1000), k(1000), l(1000), h As Double
  
j0 = Val(Form1.Text3.Text)
h = Val(Form1.Text2.Text)
'赋值
Data1.Recordset.MoveFirst
For j = 0 To j0 - 1
   x(j) = Data1.Recordset.Fields("X坐标值")
   y(j) = Data1.Recordset.Fields("Y坐标值")
              Data1.Recordset.MoveNext
Next j
  
'写ANSYS命令流
  
Open "d:\kpdat.txt" For Output As #1
  
Print #1, "/PREP7"
For i = 1 To j0 - 2
  
If y(i - 1) = y(i + 1) Then
x1(i) = x(i)
y1(i) = y(i) + h
Else
l(i) = Sqr((x(i + 1) - x(i - 1)) ^ 2 + (y(i + 1) - y(i - 1)) ^ 2)
If y(i - 1) > y(i + 1) Then
x1(i) = Round(x(i) + h * (x(i + 1) - x(i - 1)) / l(i), 6)
y1(i) = Round(y(i) + h * (y(i + 1) - y(i - 1)) / l(i), 6)
Else
x1(i) = Round(x(i) - h * (x(i + 1) - x(i - 1)) / l(i), 6)
y1(i) = Round(y(i) + h * (y(i + 1) - y(i - 1)) / l(i), 6)
End If
End If
  
Print #1, "k,"; i; ","; x1(i); ","; y1(i)
Next
  
Print #1, "FLST,3,"; j0 - 2; ",3"
For i = 1 To j0 - 2
Print #1, "FITEM,3,";
Print #1, i
Next
Print #1, "BSPLIN, ,P51X"
Close #1
Call Shell("D:\crack\v71\ANSYS\bin\intel\ansysir.exe -b -p ansys_product_feature -i input_file -o output_file", 4)
  
End Sub
  
这样就可以生产一段ANSYS的命令流,如下:
/PREP7
k, 1 , .084058 , .187923  
k, 2 , .12083 , .265052  
k, 3 , .222579 , .369824  
k, 4 , .38136 , .407249  
k, 5 , .588 , .516  
k, 6 , .691345 , .81803  
FLST,3, 6 ,3
FITEM,3, 1  
FITEM,3, 2  
FITEM,3, 3  
FITEM,3, 4  
FITEM,3, 5  
FITEM,3, 6  
BSPLIN, ,P51X
  
感谢和我交流fengguang所作的工作!
  
发贴请加上关键词。同意的顶一下。  
关键词: ANSYS 二次开发 VB VC  
祝大家好运。

评分

1

查看全部评分

发表于 2004-8-27 15:41:42 | 显示全部楼层 来自 黑龙江哈尔滨

回复: 【转帖】二次开发调试技术,供搞二次开发的同行分享

很好
发表于 2004-8-30 20:49:27 | 显示全部楼层 来自 上海徐汇区

回复: 【转帖】二次开发调试技术,供搞二次开发的同行分享

真是非常棒,中国牛人不少阿
发表于 2004-9-1 16:46:44 | 显示全部楼层 来自 陕西西安

回复: 【转帖】二次开发调试技术,供搞二次开发的同行分享

向高手学习!
发表于 2004-9-27 16:48:11 | 显示全部楼层 来自 黑龙江哈尔滨

回复: 【转帖】二次开发调试技术,供搞二次开发的同行分享

谢谢!!!
mycherry 该用户已被删除
发表于 2005-3-27 11:41:20 | 显示全部楼层 来自 山东济南
提示: 作者被禁止或删除 内容自动屏蔽
zxuf76 该用户已被删除
发表于 2005-3-30 17:33:01 | 显示全部楼层 来自 同济大学
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2005-4-9 17:01:21 | 显示全部楼层 来自 江苏徐州

Re:【转帖】二次开发调试技术,供搞二次开发的同行分享

问下:要是想VB 去实现输入坐标值(x,y,z)去查看该点的位移应该这样的啊??急
发表于 2009-11-19 14:54:36 | 显示全部楼层 来自 陕西西安
谢谢前辈!
回复 不支持

使用道具 举报

发表于 2009-12-2 16:52:56 | 显示全部楼层 来自 山西太原
谢谢!!!!!
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-9-29 21:24 , Processed in 0.062226 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表