- 积分
- 0
- 注册时间
- 2010-8-16
- 仿真币
-
- 最后登录
- 1970-1-1
|
废话不说现在就以论坛yandejun 大牛的子程序作为学习资料把Fortran语言和Abaqus用户子程序的结构以及GOLDAK热源模型一起学习(有点贪多啊~呼~~)。理解代码如下:
一、申明程序段(自己叫的):
SUBROUTINE DFLUX(FLUX,SOL,JSTEP,JINC,TIME,NOEL,NPT,COORDS,JLTYP,
1 TEMP,PRESS,SNAME)
C
c use GlobalVar
INCLUDE 'ABA_PARAM.INC'
C
parameter(one=1.d0,three=3.d0)
DIMENSION COORDS(3),FLUX(2),TIME(2)
CHARACTER*80 SNAME
接口程序段几乎大同小异,当然这个不代表我都懂,红色的那句话常量声明语句我就不太明白了,尤其是1..d0和3.d0的数据类型和这里意义。那第一句应该是声明括弧里是它所包含的形式变量上篇文章中提到过部分。二、程序主体部分:
FLUX(1)=0
c 初始时刻定义热流量为0;
a=6*0.5*90*10*1.732
c 上面定义的变量a其实就是内部双椭球热源的第一项的分子,但是没有包括比例因子f,其中90*10为Q=I*U
pi=3.14159
v=0.002
b=COORDS(1)-v*TIME(1)
c 上面的b变量貌似是定义改点距离热源中心的距离,但是后面没有利用;
d1=exp(-3*((COORDS(1)-v*TIME(1))**2/(0.0025)**2+(COORDS(2))**2
$ /(0.004)**2+(COORDS(3))**2/(0.0025)**2))
c 上面所说的d1就是前1/4椭球部分热流量的后半部分
d2=exp(-3*((COORDS(1)-v*TIME(1))**2/(0.0075)**2+(COORDS(2))**2
$ /(0.004)**2+(COORDS(3))**2/(0.0025)**2))
c d2则为后1/4椭球部分热流量的后半部分
c 起弧与收弧各留6mm
if((COORDS(1).ge.(v*TIME(1))).and.(COORDS(1).ge.0.000)
$ .and.(COORDS(1).le.0.004)) then
c 如果这一点的x坐标>=速度与时间的乘积且>=0且小于0.004。总的一句话就是该点是否位于0~4mm之间
c 这里所谓速度与时间的乘积目的是要找到双椭球的两个椭球的分界线位置
c 红色的那句话是不是应该是abs(b)才对
FLUX(1)=0.4*a*d1*0.6/(pi*(0.004*0.0025*0.0025)*sqrt(pi))
c 那么给该店输入上面这么大的热流量,即前1/4椭球所对应的热流量
endif
if((COORDS(1).le.(v*TIME(1))).and.(COORDS(1).ge.0.00)
$ .and.(COORDS(1).le.0.004)) then
c 该点的x坐标是否在0~4之间但小于速度与时间的乘积
FLUX(1)=0.4*a*d2*1.4/(pi*(0.004*0.0025*0.0075)*sqrt(pi))
endif
if((COORDS(1).ge.(v*TIME(1))).and.(COORDS(1).gt.0.004)
$ .and.(COORDS(1).le.0.064)) then
FLUX(1)=a*d1*0.6/(pi*(0.004*0.0025*0.0025)*sqrt(pi))
endif
if((COORDS(1).le.(v*TIME(1))).and.(COORDS(1).gt.0.004)
$ .and.(COORDS(1).le.0.064)) then
FLUX(1)=a*d2*1.4/(pi*(0.004*0.0025*0.0075)*sqrt(pi))
endif
if((COORDS(1).ge.(v*TIME(1))).and.(COORDS(1).gt.0.064)
$ .and.(COORDS(1).le.0.07)) then
FLUX(1)=0.85*a*d1*0.6/(pi*(0.004*0.0025*0.0025)*sqrt(pi))
endif
if((COORDS(1).le.(v*TIME(1))).and.(COORDS(1).gt.0.064)
$ .and.(COORDS(1).le.0.07)) then
FLUX(1)=0.85*a*d2*1.4/(pi*(0.004*0.0025*0.0075)*sqrt(pi))
endif
if((COORDS(1).ge.(v*TIME(1))).and.(COORDS(1).gt.0.07)
$ .and.(COORDS(1).le.0.072)) then
FLUX(1)=0.73*a*d1*0.6/(pi*(0.004*0.0025*0.0025)*sqrt(pi))
endif
if((COORDS(1).le.(v*TIME(1))).and.(COORDS(1).gt.0.07)
$ .and.(COORDS(1).le.0.072)) then
FLUX(1)=0.73*a*d2*1.4/(pi*(0.004*0.0025*0.0075)*sqrt(pi))
endif
if((COORDS(1).ge.(v*TIME(1))).and.(COORDS(1).gt.0.072)
$ .and.(COORDS(1).le.0.076)) then
FLUX(1)=0.6*a*d1*0.6/(pi*(0.004*0.0025*0.0025)*sqrt(pi))
endif
if((COORDS(1).le.(v*TIME(1))).and.(COORDS(1).gt.0.072)
$ .and.(COORDS(1).le.0.076)) then
FLUX(1)=0.6*a*d2*1.4/(pi*(0.004*0.0025*0.0075)*sqrt(pi))
endif
if((COORDS(1).ge.(v*TIME(1))).and.(COORDS(1).gt.0.076)
$ .and.(COORDS(1).le.0.08)) then
FLUX(1)=0.2*a*d1*0.6/(pi*(0.004*0.0025*0.0025)*sqrt(pi))
endif
if((COORDS(1).le.(v*TIME(1))).and.(COORDS(1).gt.0.076)
$ .and.(COORDS(1).le.0.08)) then
FLUX(1)=0.2*a*d2*1.4/(pi*(0.004*0.0025*0.0075)*sqrt(pi))
endif
c 看了这么多if语句感觉就是判断好该点的位置然后根据GOLDAK模型赋予相应热流
write(*,*) 'TIME(1) =',TIME(1)
c 一个简单的输出语句可以跟踪子程序的执行情况
RETURN
end subroutine DFLUX
三、关于该子程序的一点疑问:
- 就是上面所说的红色部分代码是不是不正确的?
- 整个if程序段好像都是通过判断x坐标的位置给该赋予热流量的,那么问题是GOLDAK模型是一个双椭球模型仅仅判断x坐标就给赋值是不是会有问题?Y方向不是也有不同热流啊,这样的话是不是不行啊~
四、说明:
以上全是自己的理解一定有很多错误的地方,发表在这里像是让论坛里前辈们好好指导指导,好让自己和初学子程序的新人们也能有所收获~~
|
|