回 帖 发 新 帖 刷新版面

主题:子程序调用不了,求指点

    这是我需要在ABAQUS中调用的fortran90子程序,前面一节说明都是照标准格式来的,是对的,从 pi=2.*ASIN(1.0)起,后面就是我自己编的,子程序有错误,运行不了,希望高手指点

SUBROUTINE UTRACLOAD(ALPHA,T_USER,KSTEP,KINC,TIME,NOEL,NPT,
     1 COORDS,DIRCOS,JLTYP,SNAME)
C
      INCLUDE 'ABA_PARAM.INC'
C
      CHARACTER*80 SNAME
      DIMENSION T_USER(3), TIME(2), COORDS(3), DIRCOS(3,3)
      
      pi=2.*ASIN(1.0)
      cs=1400.
      cp=2424.87 
      damp_cs=19.05*2.7*cs
      damp_cp=19.05*2.7*cp
      stif_n=19.05*5.292*1000000.0/381.0
      stif_t=19.05*0.5*5.292*1000000.0/381.0

      tsd=COORDS(2)/cs
      tpd=COORDS(2)/cp 
      write(15,50)coords(2),time(1),f
      50 format(2f10.5,f15.6)  

      if(COORDS(2).LE.0.1.and.COORDS(2).GE.-0.1.and.COORDS(1).LE.762.1.a
     2nd.COORDS(1).GE.-0.1)then
      ALPHA=stif_t*(pulse_u(time(1)))+damp_cs*2*pulse(time(1))
      else if(COORDS(2).LE.361.1.and.COORDS(2).GE.-0.1.and.COORDS(1).LE.
     30.1.and.COORDS(1).GE.-0.1)then
      ALPHA=damp_cs*(pulse(time(1)-tsd)-pulse(time(1)-0.5442857+tsd))

      else if(COORDS(2).LE.361.1.and.COORDS(2).GE.-0.1.and.COORDS(1).LE.
     4762.1.and.COORDS(1).GE.761.9)then 
      ALPHA=-damp_cs*(pulse(time(1)-tsd)-pulse(time(1)-0.5442857+tsd))

      end if
      RETURN
      end
      
       SUBROUTINE DLOAD(F,KSTEP,KINC,TIME,NOEL,NPT,LAYER,KSPT,COORDS,
     5 JLTYP,SNAME)
C
      INCLUDE 'ABA_PARAM.INC'
C
      DIMENSION TIME(2),COORDS(3)
      CHARACTER*80 SNAME      
      cs=1400.
      cp=2424.87 
      damp_cs=19.05*2.7*cs
      damp_cp=19.05*2.7*cp
      stif_n=19.05*5.292*1000000./381.
      stif_t=19.05*0.5*5.292*1000000./381.

      tsd=COORDS(2)/cs
      tpd=COORDS(2)/cp  

      if(COORDS(2).LE.361.1.and.COORDS(2).GE.-0.1.and.COORDS(1).LE.0.1.a 
     6nd.COORDS(1).GE.-0.1)then
      F=stif_n*(pulse_u(time(1)-tsd)+pulse_u(time(1)-0.5442857+tsd))+
     7damp_cp*(pulse(time(1)-tsd)+pulse(time(1)-0.5442857+tsd))

      else if(COORDS(2).LE.361.1.and.COORDS(2).GE.-0.1.and.COORDS(1).LE.
     8762.1.and.COORDS(1).GE.761.9)then 
      F=stif_n*(pulse_u(time(1)-tsd)+pulse_u(time(1)-0.5442857+tsd))+
     9damp_cp*(pulse(time(1)-tsd)+pulse(time(1)-0.5442857+tsd))
      END IF
      RETURN
      END
      
      function pulse_u(t)
      pulse_u=0
      if(t.ge.0.and.t.le.0.50)then
      pulse_u=sin(4*pi*t)-0.5*sin(8*pi*t)
      else
      pulse_u=0.0
      endif
      end function
      function pulse(t)
      pulse=0.0
      if(t.ge.0.and.t.le.0.50)then
      pulse=4*pi*cos(4*pi*t)-4*pi*cos(8*pi*t)
      else
      pulse=0.0
      endif
      end function

回复列表 (共7个回复)

沙发

是DLL編譯模式么?

板凳


我不知道什么是DLL编译程序,反正就是我用的abaqus软件要调用这个子程序,由于我的子程序中有两个函数,需不需要用use module呢?即用如下格式
     在subroutine中加入 USE MOU_LIB
然后后面改成,还是不行啊
     MODULE MOU_LIB
      CONTAINS
      function pulse_u(t)
      pulse_u=0
      if(t.ge.0.and.t.le.0.50)then
      pulse_u=sin(4*pi*t)-0.5*sin(8*pi*t)
      else
      pulse_u=0.0
      endif
      end function
      function pulse(t)
      pulse=0.0
      if(t.ge.0.and.t.le.0.50)then
      pulse=4*pi*cos(4*pi*t)-4*pi*cos(8*pi*t)
      else
      pulse=0.0
      endif
      end function
      END MOU_LIB
      

3 楼

不是這意思,是你新建的工程建立的是Console程序還是Dynamic Link Library?
如果是前者,那您還是重建工程吧,ABQ需要的應該是后者才對:)

4 楼


多谢cgl_lgs大哥。我使用的是Dynamic Link Library啊,在运行ABA时,软件根据给定的地址,自动调用这个程序,但是程序能编译和link成功,但是程序中定义的力根本没起任何作用,而且经过多次尝试,我认为是程序的问题

5 楼

那你在abaqus里执行命令时是怎样做的?
abaqus job=XXX user=OOO

6 楼


是的啊,莫非cgl_lgs大哥你也用abaqus?
另外还有一种方式就是在job选项卡的general选项中指定子程序地址

7 楼

我很少用abaqus,因为原本自己维护的就是有限元程序。只是偶尔用用而已。
你用dependency看看你编译出来的dll有没有正确地导出函数。
另:你的参数列表及函数名称对不对也需要确认一下(我很久没接触这个自写模块了)。
还有:你的abq_param.inc是_dp的版本还是sp的版本?换个版本试试呢?

我来回复

您尚未登录,请登录后再回复。点此登录或注册