4.8.2.16. TRANSLATIONAL_FORCE

This subroutine defines a user - defined translational force vector.

Table 4.43 Function Name

Language type

Subroutine

FORTRAN

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

C/C++

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

Table 4.44 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 the 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[3]

Returned force vector and three-dimensional variables.

Example

../_images/image331.gif

Figure 4.119 Example Model using Translational 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.30 Fortran code for Translational Force
 C---- SUB. TRANSLATIONAL_FORCE
       SUBROUTINE TRANSLATIONAL_FORCE
     &          (TIME,UPAR,NPAR,JFLAG,IFLAG,RESULT)
 C---- TO EXPORT * SUBROUTINE
       !DEC$ ATTRIBUTES DLLEXPORT,C::TRANSLATIONAL_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 value. (Output)

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

 C---- USER STATEMENT
 C---- LOCAL VARIABLE DEFINITIONS
 INTEGER I
       INTEGER MINUS(3)
       DOUBLE PRECISION VALUE(3)

 C---- ASSIGN IMPACT PARAMETERS
       MINUS(1) = UPAR(1)
       MINUS(2) = UPAR(2)
       MINUS(3) = UPAR(3)

 DO I=1, 3
 IF(I .EQ. 0) THEN
 VALUE(I) = 8;
 ELSE IF(I .EQ. 1) THEN
 VALUE(I) = 24*TIME;
 ELSE
 VALUE(I) = 48*(TIME**2);
 ENDIF

 IF(MINUS(I) .NE. 0) THEN
 VALUE(I) = -VALUE(I);
 ENDIF
 ENDDO

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

       RETURN
       END
Listing 4.31 C/C++ code for Translational Force
 #include "stdafx.h"
 #include "DllFunc.h"
 #include <math.h>

 TranslationalForce_API void __cdecl translational_force(double time, double upar[], int npar, int jflag, int iflag, double result[3])
 {
   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 value. (Output)

   // User Statement
   // Local Variable Definition
   int minus[3];
   double value[3];

   // Assign Impact Parameters
   minus[0] = (int) upar[0];
   minus[1] = (int) upar[1];
   minus[2] = (int) upar[2];

   for (int i = 0; i < 3; i++)
   {
     if (i == 0)
     {
       value[i] = 8;
     }
     else if (i == 1)
     {
       value[i] = 24*time;
     }
     else
     {
       value[i] = 48*pow(time, 2);
     }

     if (minus[i] != 0)
     {
       value[i] = -value[i];
     }
   }

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