- 积分
- 36
- 注册时间
- 2004-2-6
- 仿真币
-
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2006-5-22 18:10:21
|
显示全部楼层
来自 大连理工大学
顺便说明一下,这几个帖子都是转发的
调试FEPG的填写文件---PDE篇(续1)
先看看第一个defi信息段容易出现的问题。
我们来看看下面的一个例子
DEFI
DISP u,v
COOR x,y
COEF ua,va,fu,fv,gx,gy
FUNC funa,funb,func
MATE em;ed;eqx;eqy;2.5e-7;1.0e-6;0.0;0.0;
SHAP %1,%2
GAUS %3
MASS %1;em
DAMP %1;ed
LOAD eqx;eqy
$C6 dimension d(3,3),dp(3,3),p(3),DE(3),DV(3)
$C6 EXTERNAL PRAGER
$C6 if (time.le.0.1) then
$C6 C=time+1.
$C6 else
$C6 C=1
$C6 endif
上面的defi信息段有什么问题吗???
1,这个defi信息段中有插入fortran源程序的几行,其中有关于变量定义的,如
$C6 dimension d(3,3),dp(3,3),p(3),DE(3),DV(3)
$C6 EXTERNAL PRAGER
而这个defi信息段也有mate行,注意,mate行在生成单元子程序的for文件时,是一些赋值语句,在fortran77的语法中,变量定义要放在语句之前。所以,这个defi信息段应该写成
DEFI
DISP u,v
COOR x,y
COEF ua,va,fu,fv,gx,gy
FUNC funa,funb,func
SHAP %1,%2
GAUS %3
MASS %1;em
DAMP %1;ed
LOAD eqx;eqy
$C6 dimension d(3,3),dp(3,3),p(3),DE(3),DV(3)
$C6 EXTERNAL PRAGER
MATE em;ed;eqx;eqy;2.5e-7;1.0e-6;0.0;0.0;
$C6 if (time.le.0.1) then
$C6 C=time+1.
$C6 else
$C6 C=1
$C6 endif
才行。注意mate行的位置变化。
2,不知大家有没有疑问,time这个变量是从哪里来的?
在PDE文件中,如果有mate行,系统在生成单元子程序的过程中,除了em,ed等那些变量外,还会增加time、dt、imate、ielem和nelem等五个变量(4.2中是前面四个),它们分别表示当前时刻(time)、时间步长(dt)、材料号(imate)、单元号(ielem)和单元总数(nelem)(4.2中ielem为单元总数)。所以,在这个文件中mate行要写在
$C6 if (time.le.0.1) then
$C6 C=time+1.
$C6 else
$C6 C=1
$C6 endif
之前,否则,time还没赋值呢。
3,imate是材料号,就是在gid中,每种单元类型添加的那个材料号,利用这个号,
我们可以对不同的材料做处理,比如有一种非线性材料,一种线性材料,线性材料的参数
我们可以在pre文件中给出,非线性材料,我们可以在pde文件中利用一个fortran的subroutine给出,然后用这个imate把它区分开。
4,注意不要将defi信息段中的那些系统关键字写错了,如gaus写成guas呀!
5,大家注意,defi信息段中的coef(耦合变量名)和coor(坐标变量名),在defi段中只是一个名字,还没有赋值,当我们添加fortran程序要用到这些变量时,要在stif或func信息段来添加那些fortran程序,这时,这些变量才有值切记切记。
6,在执行计算过程中,如果e单元计算程序,出现除零或数组超阶错误,有可能有几个原因:
a . 前处理划分网格的单元类型和计算时的单元类型对不上。如前处理划分的网格是三角形,而生成计算程序时的单元类型是四边形。
b . pde文件中,添加的fortran程序中会出现除零的情况。fepg生成的fortran77的源程序,对变量名有一些默认的规定,如实形数是首字母a-h,o-z,而整形数是i-n,如ai如果不规定它的数据类型,是实形数,而ia是整形数。那么在添加fortran程序时,不要把实形数取成整形数的名字,这样很容易出现除零错误的。 |
|