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

subroutine 参数传递问题

[复制链接]
发表于 2006-11-23 20:44:17 | 显示全部楼层 |阅读模式 来自 德国
在abaqus input文件里面要分别调用两个user subroutine,现在有个参数在第一个user subroutine里面求得其值,希望在第二个user subroutine里面能调用这个值,怎么实现呢?可以定义一个超越subroutine范围的类似全局变量的东西吗?先谢谢了!
发表于 2006-11-23 21:15:42 | 显示全部楼层 来自 湖北宜昌
Simdroid开发平台
FORTRAN语言中有全局变量的功能,COMMON/KTIMEBLOCK/ KTIME
我今才调试好一个。最好用UEXTERNALDB在每增量中传递。
SUBROUTINE UEXTERNALDB(LOP,LRESTART,TIME,DTIME,KSTEP,KINC)
C
      INCLUDE 'ABA_PARAM.INC'
C
      DIMENSION TIME(2)
C
      real :: KTIME
          COMMON/KTIMEBLOCK/ KTIME
        KTIME=DTIME
!!!!!!!!!!!!!!!!!!!!!!!

      RETURN
      END
 楼主| 发表于 2006-11-23 21:24:05 | 显示全部楼层 来自 德国
没看太明白,可否说得详细一些啊,我是在subroutine sigini里面求得一个变量值,比如k,在另外一个subroutine hardini里面,怎么把这个k的值得到?
发表于 2006-11-23 22:12:17 | 显示全部楼层 来自 湖北宜昌
定义我说的SUBROUTINE UEXTERNALDB后,其他SUBROUTINE依葫芦画瓢。
SUBROUTINE DISP()
C
      INCLUDE 'ABA_PARAM.INC'
C
      DIMENSION TIME(2)
C
      real :: KTIME
          COMMON/KTIMEBLOCK/ KTIME
        KTIME=DTIME
!!!!!!!!!!!!!!!!!!!!!!!
!!操作

      RETURN
      END

SUBROUTINE DFLUx()
C
      INCLUDE 'ABA_PARAM.INC'
C
      DIMENSION TIME(2)
C
      real :: KTIME
          COMMON/KTIMEBLOCK/ KTIME
        KTIME=DTIME
!!!!!!!!!!!!!!!!!!!!!!!
!!操作

      RETURN
      END

GOOD LUCK!!!

评分

1

查看全部评分

发表于 2006-11-23 22:32:48 | 显示全部楼层 来自 新加坡
很多SUBROUTINE都支持一个STATE VARIABLE,缩写为STATEV;并且在计算过程中可以UPDATE
发表于 2006-11-23 22:34:26 | 显示全部楼层 来自 新加坡
c                    user subroutine usdfld
      subroutine usdfld(field,statev,pnewdt,direct,t,celent,time,dtime,
     1 cmname,orname,nfield,nstatv,noel,npt,layer,kspt,kstep,kinc,
     2 ndi,nshr,coord,jmac,jmtyp,matlayo,laccflg)
c
      include 'aba_param.inc'
c
      character*80 cmname,orname
      character*3  flgray(15)
      dimension field(nfield),statev(nstatv),direct(3,3),t(3,3),time(2),
     * coord(*),jmac(*),jmtyp(*)
      dimension array(15),jarray(15)
c
c      real a,b,c,x0,y0,z0,e,s1,s2,s3,s23,x,y,z,f1,g1,f2,g2
c       
c Get field variables using the coords of material point
c
      a=1000.d0
      b=10.d0
      c=20.d0
c
      x0=-250.d0
      y0=-10.d0
      z0=0.d0
c
      e=210000.d0
      s1=100.d0
      s2=100.d0
      s3=100.d0
      s23=100.d0
c
      x=(coord(1)-x0)/a
      y=(coord(2)-y0)/b
      z=(coord(3)-z0)/c
c
      f1=(1+cos(3.1415926d0*z))/2.d0
      g1=(1-cos(3.1415926d0*y))/2.d0
      f2=sqrt(3.d0)*(1-abs(z))*sin(3.1415926d0*z)
      g2=sin(3.1415926d0*y/2.d0)/2.d0
c
      FIELD(1)=-1.*s1/e*f1*g1
      FIELD(2)=-1.*s2/e*f1*g1
      FIELD(3)=-1.*s3/e*f1*g1
      FIELD(4)=-1.*s23/e*f2*g2
c
      STATEV(1)= FIELD(1)
      STATEV(2)= FIELD(2)
      STATEV(3)= FIELD(3)
      STATEV(4)= FIELD(4)
c
c      WRITE(6,*) NOEL, NPT, FIELD(1)                
      return
      end
c
c                    
c                    user subroutine uexpan
c
      subroutine uexpan(expan,dexpandt,temp,time,dtime,predef,dpred,
     $     statev,cmname,nstatv,noel)
c                    
      include 'aba_param.inc'
c                    
      character*80 cmname
c                    
      dimension expan(*),dexpandt(*),temp(2),time(2),predef(*),
     $     dpred(*),statev(nstatv)
c                           
c                       
      expan(1) = STATEV(1)
      expan(2) = STATEV(2)
      expan(3) = STATEV(3)
      expan(4) = 0.
      expan(5) = 0.
      expan(6) = STATEV(4)       
c                       
c
c      WRITE(6,*) NOEL, expan(1)  
      return
      end
这是我做的一个简单例子,STATEV就用来在两个子程序之间传递变量

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-22 09:10 , Processed in 0.047200 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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