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

[子程序] 对一段DFLUX程序的学习

[复制链接]
发表于 2010-9-17 08:58:49 | 显示全部楼层 |阅读模式 来自 陕西西安
   废话不说现在就以论坛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方向不是也有不同热流啊,这样的话是不是不行啊~
四、说明:
       以上全是自己的理解一定有很多错误的地方,发表在这里像是让论坛里前辈们好好指导指导,好让自己和初学子程序的新人们也能有所收获~~
 楼主| 发表于 2010-9-21 09:19:39 | 显示全部楼层 来自 陕西西安
Simdroid开发平台
居然沉下去了,没人能解答一下吗?yandejun大牛呢?
回复 不支持

使用道具 举报

发表于 2010-9-25 13:31:45 | 显示全部楼层 来自 上海
弱弱的问一下,程序中的$符号是什么意思呢?
回复 不支持

使用道具 举报

发表于 2010-9-26 10:43:51 | 显示全部楼层 来自 江苏南京
$符号是FORTRAN语言的换行符号,稍微长一点的FORTRAN语句一般会用到。现在也可以用1234等来表示。

  parameter(one=1.d0,three=3.d0)是定义常变量的值。大部分高级语言中都有这么一种常变量,用来定义不改变其值的变量。
回复 不支持

使用道具 举报

发表于 2010-9-26 13:03:46 | 显示全部楼层 来自 江苏南京
本帖最后由 铁道科学 于 2010-9-26 13:09 编辑
$符号是FORTRAN语言的换行符号,稍微长一点的FORTRAN语句一般会用到。现在也可以用1234等来表示。

  parameter(one=1.d0,three=3.d0)是定义常变量的值。大部分高级语言中都有这么一种常变量,用来定义不改变其值的 ...
xycf_a 发表于 2010-9-26 10:43

楼主这程序贴的那叫一个乱,用代码编辑一下多好
准确的说,这个$是Fortran 77 格式的换行符,可以用这个字符但不仅仅这个字符,Fortran 77 是固定格式,这个字符的缩进必须遵循格式。
现在Fortran的标准主流是Fortran90/95,换行符是“&”,Fortran 2003标准也如此,比如:
  1. a=1+2+3+&
  2.   5+6+7
复制代码
另外补充一下,1.d0表示双精度实数1.0,没什么特别意义。
回复 不支持

使用道具 举报

发表于 2019-10-17 11:07:37 | 显示全部楼层 来自 陕西西安
楼主请问怎么在某一时间内在固定区域施加固定热源呢?能否解答一下下?谢谢了
回复 不支持

使用道具 举报

发表于 2019-12-11 15:33:28 | 显示全部楼层 来自 辽宁沈阳
非常感谢你非常感谢你
回复 不支持

使用道具 举报

发表于 2020-12-5 19:42:41 | 显示全部楼层 来自 四川成都
为什么我用for程序用在显示热力耦合里。为什么显示NO VDFLUX SUBROUTINE WAS SUPPLIED FOR THE USER DFLUX。一直找不到原因
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

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

GMT+8, 2024-10-1 07:43 , Processed in 0.039182 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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