iCAx开思网

标题: 请教关于在Adams/Rail模块中使用用户自定义子程序的问题 [打印本页]

作者: binghu79448981    时间: 2011-7-18 12:39
标题: 请教关于在Adams/Rail模块中使用用户自定义子程序的问题
我想要在一个Adams/Rail的模型中使用用户自定义子程序,并solver方式运行
非template模块中这个目标我能够实现,现在的问题是想在Adams/Rail模块中实现,并且是用C语言编写的子程序,而不是fortran编写的。

       我的环境是Adams2005.0.0,还安装了Visual C++6.0(SP6)和Compaq Visual Fortran6.6B

       我查了帮助文档,需要在MDI_ACAR_PRIVATE_DIR环境变量定义的路径下,默认是C:\Documents and Settings\用户名\arail_private路径下,我将userPortName.h,utilCcallable.h,DFORMD.LIB,DFPORT.LIB以及C语言编写的用户自定义子程序都放在这个目录下,并且按照Adams帮助文档,把C语言编写的用户自定义子程序用户名改为req123.c  ,内容为:   (这里为了试验能否通过,函数里面没有加任何内容)

#define   port2pcnt
#include "userPortName.h"
#include "utilCcallable.h"
VOID_FUNCTION req123(int *id, double *time, double *par, int *nPar, BOOL *iflag, double *results)
{
}

并把列车车辆模型中生成了一个REQUEST,并选择Define Using Subroutine,参数写123,1
用file_only模式进行Dynamic Analysis
生成d1_dyn.adm文件和d1_dyn.acf文件
确认adm文件中有
!                            adams_view_name='REQ_1'
REQUEST/272, FUNCTION = USER(123,1)

acf文件的内容为

d1_dyn.adm
d1_dyn
preferences/solver=cxx
simulate/static
array/3, numbers = 2, 1, 20.000000
simulate/static
control/function=user(917,6,20.000000)
control/function=user(300,20.000000,248)
simulate/dynamic, end=5.0, steps=500
STOP
!


在命令行窗口中,将路径调到C:\Documents and Settings\用户名\arail_private路径下
运行  
C:\Documents and Settings\用户名\arail_private>adams05 arail cr-solverprivate n 回车
req123.c回车
回车

出现的错误如下图所示


虽然有错误,但是在该路径下adams生成的dispatch.f文件中添加了对应req子程序第一个参数为123的一段:
      subroutine reqsub( ID,
     &                   TIME,
     &                   PAR,
     &                   NPAR,
     &                   IFLAG,
     &                   RESULT )
C    This is a dispatcher routine written by gendisp.exe
      INTEGER  ID
      DOUBLE PRECISION  TIME
      DOUBLE PRECISION  PAR(*)
      INTEGER  NPAR
      LOGICAL  IFLAG
      DOUBLE PRECISION  RESULT(8)
C Local variables
      character*(80)     errmsg
......
      ELSE IF ( INT(PAR(1)).EQ.123 ) THEN
         CALL req123 ( ID,
     &                   TIME,
     &                   PAR,
     &                   NPAR,
     &                   IFLAG,
     &                   RESULT )
      ELSE
......

如将用户自定义子程序名字改为reqsub123.c,则运行
C:\Documents and Settings\用户名\arail_private>adams05 arail cr-solverprivate n req123.f  回车回车
能通过,但是查看dispatch.f,其中没有添加reqsub子程序对应处理第一个参数为123的一段程序,下面再运行
C:\Documents and Settings\用户名\arail_private>adams05 arail ru-solver d1_dyn.acf会报错,无法正常仿真模型,错误如下图:


我按照上述完全相同的方法,改为采用fortran编写用户自定义子程序req123.f,内容为
      subroutine req123( id, time, par, npar, iflag, result )
      integer            id, npar
      double precision   time, par(*), result(8)
      logical            iflag
      return
      end
则C:\Documents and Settings\用户名\arail_private>adams05 arail cr-solverprivate n req123.f 回车回车
能通过
再运行C:\Documents and Settings\用户名\arail_private>adams05 arail ru-solver d1_dyn.acf
也能一切正常的运行

我现在的疑问是,是Adams/Rail模块中使用用户自定义子程序只能用fortran编程吗?还是我文件名,函数名或者哪里写的有问题,因为我fortran不熟,而且子程序内容比较复杂,还涉及到内存映射文件什么的,所以还是希望尽量能够实现用C语言编程,不知道有没有大侠做过类似的工作或者知道该怎么做,能不能指导一下,非常感谢
作者: binghu79448981    时间: 2011-7-20 12:35
自己顶起来,有没有人做过adams的template模块(如Rail,Car等等)的用户自定义子程序啊,各位大侠高手指点一下我这枚菜鸟吧




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3