资源描述
第9章 ADAMS用户子程序
第9章ADAMS用户子程序
本章对ADAMS用户子程序做了简要介绍,着重介绍了CONSUB、GFOSUB和REQSUB的使用方法,以及在用户子程序中两个最常用的功能子程序SYSARY和SYSFNC的使用情况。通过本章的学习,读者将具备基本的开发用户子程序的能力。
9.1 ADAMS用户子程序简介
一般情况下,ADAMS的大部分功能可以通过函数表达式完成,函数表达式很容易操作,因为不必编译或连接程序,而且ADAMS/Solver还会实时地提供函数表达式。但函数表达式提供的只是有限的编程结构,因此有些复杂的情况,特别是涉及到一些逻辑表达,用函数表达式则很难表达出来。因此在需要采用一些ADAMS没有提供的特殊函数时,可以采用用户子程序。
用户子程序更具有通用性,可以利用编程语言来定义模型元素或者特定的输出。用户可以将函数表达式写成子程序的形式并将其与ADAMS/View连接,它具有函数表达式所没有的通用性和灵活性。子程序利用通用程序设计语言(FORTRAN或C)的功能来定义ADAMS/View不能提供的函数,并使之按照需要而量身设计。通过连接用户子程序,不会失去ADAMS/View的任何功效,也不会降低仿真速度。
当出现下列情况时,通常会使用到用户子程序:
(1)数学函数很难表达。
(2)需要定义多用户使用的函数。
(3)GSE和UCON声明时,需要用户子程序。
(4)需要控制复杂仿真运行时,以及需要作决策逻辑时。
使用用户子程序时要小心,因为不正确的用户子程序会很难调试。
9.1.1用户子程序的种类
根据用户子程序的功能,可以将它们分为三类:
(1)Driver Subroutine——驱动子程序
(2)Evaluation Subroutines——计算子程序
(3)Restart subroutines——重启子程序
1.驱动子程序(Driver Subroutine)
驱动子程序(Driver Subroutine)--CONSUB--用来驱动ADAMS/Solver。这样ADAMS/Solver在仿真时可更进一步地完成对模型的分析和修改的自动化工作。
CONSUB发出request(请求),regulate(调整),和vary simulations(改变仿真)的命令,并通过作出的交互式命令来修改数据,或者进行不同的分析。大多数运行ADAMS/Solver的情况都是交互式,或者是以批处理的形式,一次只涉及到单个的分析。使用CONSUB,可以完成对数据的动态分析,改变前提条件,并重复动态分析。
2.计算子程序(Evaluation Subroutines)
计算子程序(Evaluation Subroutines)为用户自定义。ADAMS/Solver可写子程序来对某些非标准的或复杂的计算式计算其数值。计算子程序(Evaluation Subroutine)的程序名和功能如表9-1所示。
表9-1 计算子程序(Evaluation Subroutine)的程序名和功能
子 程 序
功 能
COUSUB,CONXX,COUXX2
定义用户自定义的COUPLER
CURSUB
计算曲线坐标以及CURVE的导数
DIFSUB
计算DIFF的微分方程值
DMPSUB
计算FLEX_BODY的模型的阻尼比
FIESUB
对FIELD计算力和力矩以及它们的导数
GFOSUB
对GFORCE计算数值
GSE_DERIV
GSE_UPDATE
GSE_OUTPUT
GSE_SAMP
用GSE来计算当前状态和输出的偏导数值
MFOSUB
对MFORCE计算模型值
MOTSUB
对MOTION计算绞点位移,速度和加速度
REQSUB
对REQUEST计算输出值
SENSUB
对SENSOR计算感应值
SFOSUB
对SFORCE计算力的大小
TIRSUB
对于轮胎接触,定义三个力和三个力矩
UCOSUB
对UCON计算约束值和其导数
VARSUB
对VARIABLE计算其代数值
VFOSUB
对VFOSUB计算力的分量
VTOSUB
对VTORUE计算力矩的分量
3.重启子程序(Restart Subroutines)
重启子程序(Restart subroutines)由一对子程序组成,SAVESUB和RELSUB。它们可以保存和重新加载子程序运行过程中的某些状态变量,这些状态变量是那些相关的用户子程序在重新启动或进行某些变量初始化时所必须的数据。如果在用户子程序之间相互调用时,需要使用它们在子程序内部保存数据。如果没有使用RELSUB和SAVSUB,在保存仿真文件时,内部数据就会丢失。
虽然SAVE命令可将模型和仿真数据保存到文件中去,而且可以通过使用RELOAD命令重新调入保存文件,并可以从该保存点重新启动仿真。但SAVE和RELOAD不可能对用户子程序的内部数据进行特殊操作,在RELOAD命令之后,ADAMS/Solver会从仿真流程中断点继续调用用户子程序,但用户子程序中某些感兴趣的内部变量却没有得到保存。
例如,假设SFOSUB子程序中力的系数是一个内部状态变量,如果打算将第一次调用SFOSUB子程序时所计算的力的系数保存以作今后使用,若用“SAVE”和“RELOAD”时会产生数据丢失。可用SAVSUB将计算出来的系数保存在文件中并用RELSUB重新调入它们,或者力仅仅用RELSUB来重新计算系数。重启子程序(Restart Subroutine)的程序名和功能如表9-2所示。
表9-2 重启子程序(Restart Subroutine)的程序名和功能
子 程 序
功 能
RELSUB
加载能使用户子程序重新启动的信息
SAVSUB
保存以后能重新启动用户子程序的信息
9.1.2 子程序的使用
相对于ADAMS/View来讲,用户定义子程序有两个任务:输入和输出。
输入就是在相应的命令或状态,或在表明当前系统状态的计算结果中,提供给ADAMS/View的相关信息。
输出就是从ADAMS/View中获得的相关信息。
1. 声明浮点变量
为了保证数值在子程序之间或者ADAMS/Solver和子程序之间能够正确地传递,需要声明浮点变量,就像在ADAMS/Solver中作的声明一样。
在UNIX和Windows机器上,ADAMS/Solver使用双精度浮点变量。因为未声明的浮点变量通常都是单精度的(如REAL),所以应当明确声明所有的浮点变量都是双精度的。
2. 参数的使用
ADAMS/View会从FUNCTION=USER()的表达式中提供给用户子程序参数值。例如,如果你使用FUNTION=(4.0,5.0,6.0),ADAMS/View通过一个包含4.0,5.0,6.0的PAR数组参数,以及通过一个值为3的NPAR参数传递这些数值。
通过使用这些功能使得用户子程序更加灵活。例如,如果计算需要marker101和marker102的距离,可以将这些标志符直接写进用户子程序。
3. 避免不连续
在运行表达式中,当使用子程序来定义运动,传感器,力,或者模型中的状态平衡方程时,应当保证这些函数是连续的。
不连续的函数很难处理,因为大多数数学理论都是假定系统方程是连续的。如果违反了该规则,ADAMS/Solver就会得出出人意料的结果。当使用IF声明,将分段函数连接起来时,常常会产生不连续函数。为了保证函数是连续的,在使用该类型的函数时,一定要小心。
4. 创建用户子程序
为了创建自己的用户子程序,ADAMS提供了子程序模板并将它们放在安装目录install_dir/adams/solver/usersubs中。
子程序不能以C语言为模板。如果需要一个C语言的子程序,必须通过修改FORTRAN文件来创建它,或者使用FORTRAN模板作为向导,创建自己的C语言格式子程序。
创建用户子程序的步骤:
(1) 决定需要创建什么样的用户子程序。例如,如果有GFORCE的声明,可以创建GFOSUB的用户子程序。
(2) 决定要计算什么,需要什么输入参数。
(3) 将合适的用户子程序模板从安装目录拷贝到当前目录。模板目录中包含了要使用的所有子程序模板。
(4) 使用文字编辑器来察看用户子程序模板。
(5) 按需要修改用户子程序。从用户子程序中调用功能子程序,或者其他FORTRAN或C语言子程序。
(6) 保存用户子程序。因为可能对不同的模型会使用相同的子程序,所以最好给文件起一个容易区分的名字。
5. 调用用户子程序
可以通过使用声明或者命令来调用用户子程序。通过使用前面定义的用户子程序的名字来让ADAMS/Solver知道调用哪一个子程序。也可以使用子程序来定义一些模型元素。能调用用户子程序的声明或命令如表9-3所示。
表9-3 调用用户子程序的声明或命令
要调用的子程序
使用的声明/命令
CONSUB
CONTROL
COUSUB,COUXX,COUXX2
COUPLER
CURSUB
CURVE
DIFSUB
DIFF
FIESUB
FIELD
GFOSUB
GFORCE
GSE_DERIV,GSE_UPDATE,
GSE_OUTPUT,GSE_SAMP
GSE
MOTSUB
MOTION
RELSUB
RELOAD
REQSUB
REQUEST
SAVSUB
SAVE
SENSUB
SENSOR
SFOSUB
SFORCE
TIRSUB
TIRE
UCOSUB
UCON
VARSUB
VARIABLE
VFOSUB
VFORCE
VTOSUB
VTORQUE
可以从用户子程序中调用功能子程序。这些子程序的功能就像是在用户的数据和用户使用的用户子程序的接口一样。例如,在driver user——written subroutine(驱动用户子程序)中,可以使用control,access功能子程序。从evaluation user——written subroutines(计算用户子程序)中,也可以调用access,function,以及某些情况下setup 函数。换句话说,可以从上面任何一个用户子程序中调用access和function函数,但用户只能从driver subroutine中调用control函数,从某个evaluation subroutines中调用setup函数。
6. 编译,连接和运行库
在写完定制的子程序后,必须要将它们编译并连接到ADAMS以创建到ADAMS/Solver的用户库文件中去。然后,可以连同该库与ADAMS/Solver一同运行。
必须有一个FORTRAN编译器,因为ADAMS本身不提供编译器,由用户子程序生成动态连接库的详细过程参见12.4.5节后半部分的介绍。
9.2 常用ADAMS用户子程序简介
9.2.1 使用GFOSUB用户子程序实例
为了使读者对用户子程序有一个直观印象,本节首先给出声明和调用GFOSUB子程序的例子,通过与GFORCE函数表达式的对比,说明使用用户子程序的必要性。有关GFOSUB用户子程序的更详细内容,将在9.2.2小节进行介绍。另外,在12.4.4节的结尾部分提供了GFOSUB用户子程序的具体工程应用实例。
现假定有如下一个GFORCE函数表达式的声明,其函数表达式定义了小球和斜面之间的某种相互作用力关系(此处相互作用力不一定有确切的物理含义,仅为了说明GFORCE的定义过程),包括力矢量和力矩矢量。如下图所示,为了在GFORCE中描述这种相互作用力关系,在小球球心上定义了标架Mark_I(ID为2001),在斜面上定义了标架Mark_R(ID为2003),同时为了确定小球对斜面的反作用力点的位置,生成与标架Mark_I时刻重叠的标架Mark_J(ID为2002),Mark_J隶属于斜面。
Part_I:小球
Mark_J:ID=2002
Mark_R:ID=2003
Mark_I:ID=2001
Part_J:斜面
图9-1 小球与斜面的坐标定义及相对关系
于是可以使用GFORCE函数表达式的声明,如下面所示(该GFORCE自身的ID为100):
GFORCE/,100 I=2001, JFLOAT=2002, RM=2003,
FX = - 10.0 * VX(2001,2003,2003)
FY = - 10.0 * VY(2001,2003,2003)
FZ = - 10.0 * VZ(2001,2003,2003)
TX = - 100.0 * WX(2001,2003,2003)
TY = - 100.0 * WY(2001,2003,2003)
TZ = - 100.0 * WZ(2001,2003,2003)
如果力和力矩的表达比较冗长,则可以使用GFOSUB用户子程序来代替GFORCE声明。以及,用下面语句调用已创建好的GFOSUB子程序,并向其传递参数。
GFORCE/,100 I=2001, JFLOAT=2002, RM=2003,
FUNCTION=USER(10.0, 100.0, 2001, 2003, 2003)
GFOSUB用户子程序的程序体创建如下:
SUBROUTINE GFOSUB(ID, TIME, PAR, NPAR, DFLAG,
& IFLAG, RESULT)
======================= 定义与声明 ===================
————————————— 外部变量定义 ——————————
INTEGER ID
DOUBLE PRECISION TIME
DOUBLE PRECISION PAR( * )
INTEGER NPAR
LOGICAL DFLAG
LOGICAL IFLAG
DOUBLE PRECISION RESULT(6)
ID 标志号,在内部程序中调用
TIME 仿真时间
PAR 不定维的数组,用以向程序传递参数,本例中维数为5,分别为:
PAR(1)=10.0
PAR(2)=100.0
PAR(3)=2001
PAR(4)=2002
PAR(5)=2003
NPAR PAR数组的维数,本例中NPAR = 5
DFLAG 积分标志位,
IFLAG 初始标志位
RESULT 返回的程序值,每一次调用可以返回六个值,本例中:
RESULT(1)为FX的值
RESULT(2)为FY的值
RESULT(3)为FZ的值
RESULT(4)为TX的值
RESULT(5)为TY的值
RESULT(6)为TZ的值
——————————— 本地变量和参数定义 —————————
DOUBLE PRECISION FCT, TCR, VEL(6)
INTEGER IPAR(3), IM, JM,RM,NSTATES
LOGICAL ERRFLG
========================可执行代码 =====================
FCT = PAR(1)
TCR = PAR(2)
IM = PAR(3)
JM = PAR(4)
RM = PAR(5)
……
调用SYSARY子程序获得计算信息:如果变量IFLAG的值为true,则将子程序初始化。.
……
———————将标架的移动和转动速度值赋给 VEL 数组————————
IPAR(1) = IM
IPAR(2) = JM
IPAR(3) = RM
CALL SYSARY(’VEL’, IPAR, 3, VEL, NSTATES, ERRFLG)
———————— 通过ERRMES 检查SYSARY调用效果 ————————
……
CALL ERRMES(ERRFLG, ’Error calling SYSARY for VEL’, ID, ’STOP’)
—————————— 返回GFORCE 的计算结果 ———————————
RESULT(1) = -FCT * VEL(1)
RESULT(2) = -FCT * VEL(2)
RESULT(3) = -FCT * VEL(3)
RESULT(4) = -TCR * VEL(4)
RESULT(5) = -TCR * VEL(5)
RESULT(6) = -TCR * VEL(6)
RETURN
END
9.2.2 常用用户定义子程序简介
下面给出了几个常用用户定义子程序的简介。对每个子程序,都提供了定义、例子、相关说明等等。
1. CONSUB用户子程序
定义: CONSUB驱动子程序用于驱动ADAMS/Solver。只能通过交互式命令CONTROL激活CONSUB,而别的用户子程序则不能调用CONSUB。
调用: 相应的调用命令为:
CONTROL/[FUNCTION=USER(r1[,…,r30])[\]]
[[ ]]中的内容表示是可选的。
输入参数构成:
CONSUB用户子程序的 输入参数构成为:
SUBROUTINE CONSUB(par,npar)
输入参数说明:
npar——整型变量,其值为par数组的维数。
par——双精度常数数组,按顺序匹配CONTROL命令中的USER括号内的参数值。
主要功能:
ADAMS/Solver将CONTROL中的常数以实数数组的形式传递给FUNCTION=USER()。从CONSUB中,会调用一些功能子程序,如SYSARY,SYSFNC或者AKISPL等,可实现以下主要功能:
(1)MODIFY功能子程序以交互式的方式调用,用来改变ADAMS/Solver的声明。
(2)调用ANALYS功能子程序的目的就是激活某一个ADAMS/Solver的分析子程序。
(3)调用DATOUT功能子程序的目的就是处理从ADAMS/Solver仿真的输出。
当CONSUB停止执行时,ADAMS/Solver会提醒你使用其他命令。如果程序的控制权交给了CONSUB,那么输出的自动生成会停止,如果想处理输出,则要调用DATOUT功能子程序。
CONSUB子程序的结构:
下面给出CONSUB子程序的结构,从而可以看出该子程序是怎样工作的。
SUBROUTINE CONSUB ( PAR, NPAR )
======================= 定义与声明 ===================
————————————— 外部变量定义 ——————————
INTEGER NPAR
DOUBLE PRECISION PAR( * )
——————————— 本地变量和参数定义 —————————
……
========================可执行代码 =====================
———————————— 用户自己的程序代码 —————————
……
RETURN
END
CONSUB子程序示例:
下面给出一个CONSUB子程序应用的例子,在该例中,首先对模型进行了一次静力学仿真(Static Simulation),然后改变Part 1 的质量后,进行一次动力学仿真(Dynamic Simulation),并输出每次仿真的结果。
首先,用交互式的命令激活CONSUB:
CONTROL/ FUNCTION=USER(r1[,...,r30])
相应的CONSUB 用户子程序为:
SUBROUTINE CONSUB(PAR, NPAR)
======================= 定义与声明 ===================
————————————— 外部变量定义 ——————————
INTEGER NPAR
DOUBLE PRECISION PAR( * )
——————————— 本地变量和参数定义 —————————
CHARACTER*10 ATYPE
CHARACTER*20 TITLE
LOGICAL ERRFLG, INIFLG
CHARACTER*80 COMMND, MESSGE
INTEGER STATUS
DOUBLE PRECISION DPZERO
PARAMETER (DPZERO = 0.0)
========================可执行代码 =====================
——————————首先进行一次静力学分析 —————————
指明分析类型和此次分析的名称
ATYPE = ’STATIC’
TITLE = ’STATIC_2003’
INIFLG = .TRUE.
调用功能子程序ANALYS进行静力学分析
CALL ANALYS(ATYPE, TITLE, DPZERO, DPZERO, INIFLG,
& STATUS)
如果仿真中出现错误,则调用ERRMES功能子程序返回错误信息并终止仿真
ERRFLG = STATUS .NE. 0
MESSGE = ’Error calling ANALYS for STATIC_1.’
CALL ERRMES(ERRFLG, MESSGE, STATUS, ’STOP’)
调用DATOUT功能子程序输出分析数据
CALL DATOUT(STATUS)
调用MODIFY功能子程序改变 PART/1 的质量
COMMND = ’PART/1, MASS = 100’
CALL MODIFY(COMMND, STATUS)
指明分析类型和分析的名称进行动力学分析
ATYPE = ’DYNAMIC’
TITLE = ’ DYNAMIC_2003’
INIFLG = .TURE.
CALL ANALYS(ATYPE, TITLE, DPZERO, DPZERO, INIFLG,
& STATUS)
ERRFLG = STATUS .NE. 0
MESSGE = ’Error calling ANALYS for STATIC_2.’
CALL ERRMES(ERRFLG, MESSGE, STATUS, ’STOP’)
CALL DATOUT(STATUS)
RETURN
END
2. GFOSUB用户子程序
定义:GFOSUB计算子程序用于计算GFORCE声明中的变量值。在GFORCE的函数表达式太复杂或计算流程需要作特殊控制时可以使用GFOSUB用户子程序。
调用:相应的调用命令为
GFOCE/id,I=id,JFLOAT=id,RM=id
FUNCTION=USER(r1[,…,r30])
([ ])中的内容表示是可选的。
输入参数构成:
GFOSUB用户子程序的 输入参数构成为:
SUBROUTINE GFOSUB(id, time, par, npar, dflag, iflag, result)
输入参数说明:
dflag——逻辑型变量;当ADAMS/Solver调用GFOSUB子程序求解某些特定的偏微分方程时其值为ture,否则设为false。
Id——整数变量;用于提供给GFORCE声明其自身的标志符。当需要GFOSUB的信息时,ADAMS/Solver可自动识别相应的函数声明中的其他信息(如par参数等)。
Iflag——逻辑型变量;当需要从GFOSUB中获得函数相关信息时,ADAMS/Solver将其设置为true;当iflag值为false时,则计算用户定义的表达式的值。
Npar——整型变量;用于指明在USER括号中使用的实参数目,也就是GFOSUB子程序中数组par的维数。
Par——双精度的常数数组;按顺序存放USER括号中实参的数值。
Time——双精度变量;传递给ADAMS/Solver当前的仿真时间。
子程序的返回结果:双精度数组,返回GFORCE构成的六个值。
GFOSUB子程序的结构:
SUBROUTINE GFOSUB(ID, TIME, PAR, NPAR, DFLAG,
& IFLAG, RESULT)
======================= 定义与声明 ===================
————————————— 外部变量定义 ——————————
INTEGER ID
DOUBLE PRECISION TIME
DOUBLE PRECISION PAR( * )
INTEGER NPAR
LOGICAL DFLAG
LOGICAL IFLAG
DOUBLE PRECISION RESULT( 6 )
——————————— 本地变量和参数定义 —————————
……
========================可执行代码 =====================
———————————— 用户自己的程序代码 —————————
……
调用SYSFNC 和/或 SYSARY为后续计算获得必要信息,如果IFLAG为真,则这些实际
上是在设置函数相关性。
CALL SYSFNC (...)
CALL ERRMES (...)
……
IF (IFLAG) THEN
———————————— 子程序初始化 —————————————
……
ENDIF
—————————— GFORCE 的相关计算代码 ——————————
……
得到计算结果 RESULT 数组的值
RESULT(1) = ...
RESULT(2) = ...
RESULT(3) = ...
RESULT(4) = ...
RESULT(5) = ...
RESULT(6) = ...
RETURN
END
有关GFOSUB的例子请参考9.2.1节和12.4.4节的结尾部分。
3. REQSUB用户子程序
定义: REQSUB用户子程序用于计算REQUEST的后处理参数的输出值,但并不是所有的REQUEST都要求有与之对应的REQSUB子程序,只有使用非标准的REQUEST输出时才会使用到。
调用: 相应的调用命令为
REQUEST/,id FUNCTION USER( 1[,... , 30]) \ [TITLE c:1,…,c:8] [,COMMENT] [[ ]]中的内容表示是可选的。
输入参数构成 :
REQSUB用户子程序的 输入参数构成为:SUBROUTINE REQSUB (id, time, par, npar, iflag, result)。
输入参数说明:
Id——整数变量;用于提供给REQRCE声明其自身的标志符。当需要REQSUB的信息时,ADAMS/Solver可自动识别相应的函数声明中的其他信息。
Iflag——逻辑型变量;当需要从REQSUB中获得函数相关信息时,ADAMS/Solver将其设置为true;当iflag值为false时,则计算用户定义的表达式的值。
Npar——整型变量;用于指明在USER括号中使用的实参数目,也就是REQSUB子程序中数组par的维数。
Par——双精度的常数数组;按顺序存放USER括号中实参的数值。
Time——双精度变量;传递给ADAMS/Solver当前的仿真时间。
REQSUB子程序的结构:
下面是REQSUB子程序的结构:
SUBROUTINE REQSUB ( ID, TIME, PAR, NPAR, IFLAG,
& RESULT )
======================= 定义与声明 ===================
————————————— 外部变量定义 ——————————
INTEGER ID
DOUBLE PRECISION TIME
DOUBLE PRECISION PAR( * )
INTEGER NPAR
LOGICAL IFLAG
DOUBLE PRECISION RESULT( 8 )
——————————— 本地变量和参数定义 —————————
……
========================可执行代码 =====================
IF( IFLAG ) THEN
子程序初始化
……
ENDIF
创建 request 信息
———————————— 用户自己的程序代码 —————————
……
将计算结果写入到 result 数组中
RESULT(1) = ...
……
RESULT(8) = ...
RETURN
END
REQSUB子程序的示例
下面是一个REQSUB用户子程序的例子。该例仍以图9-1所示的小球与斜面为例,其功能是计算小球相对于斜面的速度矢量在xoy平面的投影和小球相对于斜面的角速度矢量在yoz平面的投影,参考标架为斜面上的Mark_R,其ID=2003。
为了比较REQSUB用户子程序和REQUEST函数表达式的区别,本例首先给出可以实现上述功能的函数表达式形式:
REQUEST/8,
& F2= SQRT(VX(2001,2003,2003) ** 2 + VY(2001,2003,2003))
& \ F3= SQRT(WY(2001,2003,2003) ** 2 + WZ(2001,2003,2003))
& \ COMMENT=SHOCK ENERGY
下面给出如何通过创建REQSUB用户子程序实现上述功能。
REQSUB用户子程序的调用语句为:
REQUEST/8, FUNCTION=USER(2001,2002,2003)\ COMMENT=SHOCK ENERGY
所创建的REQSUB用户子程序为::
SUBROUTINE REQSUB ( ID, TIME, PAR, NPAR, IFLAG,
& RESULT )
======================= 定义与声明 ===================
————————————— 外部变量定义 ——————————
INTEGER ID
DOUBLE PRECISION TIME
DOUBLE PRECISION PAR( * )
INTEGER NPAR
LOGICAL IFLAG
DOUBLE PRECISION RESULT( 8 )
——————————— 本地变量和参数定义 —————————
INTEGER IPAR(3), IM, JM,RM,NSTATES
DOUBLE PRECISION DIFVAL, DERVAL,VEL(6)
LOGICAL ERRFLG
========================可执行代码 =====================
IM = PAR(1)
JM = PAR(2)
RM = PAR(3)
……
—————通过调用SYSARY将标架的移动和转动速度值赋给 VEL 数组————
VEL(1)~VEL(3)分别代表力的三个分量
VEL(4)~VEL(6)分别代表力矩的三个分量
IPAR(1) = IM
IPAR(2) = JM
IPAR(3) = RM
CALL SYSARY(’VEL’, IPAR, 3, VEL, NSTATES, ERRFLG)
———————— 通过ERRMES 检查SYSARY调用效果 ————————
CALL RRMES(ERRFLG, ’Error calling SYSARY for VEL’, ID, ’STOP’)
DIFVAL=SQRT(VEL(1) ** 2 + VEL(2) ** 2 )
DERVAL=SQRT(VEL(5) ** 2 + VEL(6) ** 2 )
……
—————————— 返回计算结果 ———————————
RESULT(1) = 0.0
RESULT(2) = DIFVAL
RESULT(3) = DERVAL
RESULT(4) = 0.0
RESULT(5) = 0.0
RESULT(6) = 0.0
RESULT(7) = 0.0
RESULT(8) = 0.0
RETURN
END
9.3 功能子程序
严格来讲,功能子程序(utility subroutines)并不属于用户子程序,但由于要实现用户子程序的功能需要经常(有时甚至是必须)调用功能子程序,因此本节对功能子程序进行简单介绍。
9.3.1 功能子程序概述
功能子程序是ADAMS提供的一类特殊的子程序,它不需要用户自己编写,其作用可以提供dataset函数的全部功能及其它功能。通常可以利用功能子程序完成如下工作:
(1)获取模型定义数据。
(2)获得当前状态信息。
(3)通过标准的曲线拟合技术实现数据点的插值。
(4)计算标准函数的值。
功能子程序可以分为以下几类:
(1)执行控制子程序(Execution Control Subroutines)。
(2)数据获取子程序(Data Access Subroutines)。
(3)自定义约束子程序(Setup Subroutine)。
(4)调用ADAMS自带函数子程序(General Subroutines)。
以上各类功能子程序所包含的子程序名和功能分别如下。
(1) 执行控制子程序(Execution Control Subroutines)
表9-4 执行子程序名及功能
子程序名
功 能
ANALYS
控制ADAMS/Solver仿真进程
DATOUT
从某次仿真计算中输出所有的数据
MODIFY
允许执行ADAMS/Solver的任何命令
(2) 数据获取子程序(Data Access Subroutines)
表9-5 数据获取子程序名及功能
子程序名
功 能
AKISPL
使用Akima三次曲线拟合方法进行数据插值
CUBSPL
使用传统的三次曲线拟合方法进行数据插值
ERRMES
输出用户子程序中的错误信息
GETCPU
得到当前CPU时间
GETINM
得到ADAMS/Solver命令输入方式的信息(交互式还是文件驱动式)
GETINT
得到当前仿真积分器的类型
GETMOD
得到当前指定分析方式的整型变量值
GETSLV
得到当前求解器的名字,是HARWELL还是CALAHAN.
GETSTM
得到当前仿真时间
GETVER
得到当前ADAMS/Solver的版本号
展开阅读全文