|
马上注册,结交更多同行朋友,交流,分享,学习。
您需要 登录 才可以下载或查看,没有帐号?注册
x
我想要在一个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语言编程,不知道有没有大侠做过类似的工作或者知道该怎么做,能不能指导一下,非常感谢 |
|