4.8.2.1. AXIAL_FORCE

This subroutine generates a user - defined axial force.

Table 4.14 Function Name

Language type

Subroutine

FORTRAN

axial_force (time,upar,npar, jflag,iflag,result)

C/C++

axial_force (double time, double upar[], int npar, int jflag, int iflag, double result)

Table 4.15 Parameter information

Variable Name

Size

Description

time

double

Current simulation time of RecurDyn/Solver.

upar

double[30]

Parameters defined by the user. The maximum size of array is 30.

npar

int

Number of user parameters.

jflag

int

When RecurDyn/Solver evaluates Jacobian, the flag is true. Otherwise, the flag is false.

iflag

int

When RecurDyn/Solver makes its initial call to this routine, the flag is true. Otherwise, the flag is false

result

double

Returned force and one-dimensional variable

Example

../_images/image316.gif

Figure 4.105 Slider Crank model using a Axial Force User Subroutine

Note

If the user wants to run this model using a user subroutine, the user can refer it in the directory (<install dir>\Help\usub\**).

Listing 4.1 Fortran code for Axial Force
 C---- SUB. AXIAL_FORCE : AXIAL(TRA,ROT)
       SUBROUTINE AXIAL_FORCE
     &          (TIME,UPAR,NPAR,JFLAG,IFLAG,RESULT)
 C---- TO EXPORT * SUBROUTINE
       !DEC$ ATTRIBUTES DLLEXPORT,C::AXIAL_FORCE

 C---- INCLUDE SYSTEM CALL
       INCLUDE 'SYSCAL.F'

 C---- DEFINE VARIABLES
 C     Parameter Information
 C     TIME   : Simulation time of RD/Solver. (Input)
 C     UPAR   : Parameters defined by user. (Input)
 C     NPAR   : Number of user parameters. (Input)
 C     JFLAG  : When RD/Solver evaluates a Jacobian, the flag is true. (Input)
 C     IFLAG  : When RD/Solver initializes arrays, the flag is true. (Input)
 C     RESULT : Returned axial force or torque value. (Output)

       DOUBLE PRECISION TIME, UPAR(*)
       INTEGER NPAR
       LOGICAL JFLAG, IFLAG
       DOUBLE PRECISION RESULT[REFERENCE]

 C---- USER STATEMENT
 C---- LOCAL VARIABLE DEFINITIONS
       INTEGER MKID(3), ID
       DOUBLE PRECISION DISP, VALUE(1)
       LOGICAL ERRFLG

 C---- ASSIGN IMPACT PARAMETERS
       MKID(1) = INT(UPAR(1))
       MKID(2) = INT(UPAR(2))
       MKID(3) = INT(UPAR(3))
       ID = INT(UPAR(4))

 C---- CALL AUXILIARY SUBROUTINES FOR CALCULATIONS
       CALL SYSFNC('DX', MKID, 3, DISP, ERRFLG)
       CALL RD_AKISPL(DISP, 0, ID, 0, VALUE(1), ERRFLG)

 C---- ASSIGN THE RETURNED VALUE
       RESULT = VALUE(1)

       RETURN
       END
Listing 4.2 C/C++ code for Aixal Force
 #include "stdafx.h"
 #include "DllFunc.h"

 AxialForce_API void __cdecl axial_force(double time, double upar[], int npar, int jflag, int iflag, double* result)
 {
   using namespace rd_syscall;
   // Parameter Information
   //   time   : Simulation time of RD/Solver. (Input)
   //   upar   : Parameters defined by user. (Input)
   //   npar   : Number of user parameters. (Input)
   //   jflag   : When RD/Solver evaluates a Jacobian, the flag is true. (Input)
   //   iflag   : When RD/Solver initializes arrays, the flag is true. (Input)
   //   result  : Returned axial force or torque value. (Output)

   // User Statement
   // Local Varialbe Definition
   int mkid[3], errflg, akispl_id;
   double disp, value[3];

   // Assign Impact Parameters
   mkid[0] = (int) upar[0];
   mkid[1] = (int) upar[1];
   mkid[2] = (int) upar[2];
   akispl_id = (int) upar[3];

   // Call the Auxiliary subroutines for Calculation
   sysfnc("DX", mkid, 3, &disp, &errflg);
   rd_akispl(disp, 0, akispl_id, 0, value, &errflg);

   // Assign the Returned Value
   *result = value[0];
 }