4.8.2.10. REQUEST

This subroutine defines a user - defined request.

Language type

Subroutine

FORTRAN

request_usub (time,upar,npar,,iflag,result)

C/C++

request_usub (double time, double upar[], int npar, int iflag, double result[8])

Table 4.32 Parameter information

Variable Name

Size

Description

time

double

Current simulation time of RecurDyn/Solver.

upar

double *

Parameters defined by the user. There is no limit about the maximum size of array.

npar

int

Number of user parameters.

iflag

int

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

result

double[8]

Returned value and eight-dimensional variable. RecurDyn/Solver reports only six variables (result(2~4) and result(6~8)) of eight returned variables.

Example

../_images/image326.gif

Figure 4.114 Double Pendulum model

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.19 Fortran code for Request
 C---- SUB. REQUEST
   SUBROUTINE REQUEST_USUB
  &          (TIME,UPAR,NPAR,IFLAG,RESULT)
 C---- TO EXPORT * SUBROUTINE
       !DEC$ ATTRIBUTES DLLEXPORT,C::REQUEST_USUB

 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     IFLAG  : When RD/Solver initializes arrays, the flag is true. (Input)
 C     RESULT : Returned values. (Output, Size : 8)

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

 C---- USER STATEMENT
       DOUBLE PRECISION DX, DY, DZ, AX, AY, AZ
       INTEGER MKID(2), i
       LOGICAL ERRFLG

       MKID(1) = INT(UPAR(1))
       MKID(2) = INT(UPAR(2))

       do i = 1, 8
         RESULT(i) = 0.0
       enddo

       call sysfnc('DX', MKID, 2, DX, ERRFLG)
       call sysfnc('DY', MKID, 2, DY, ERRFLG)
       call sysfnc('DZ', MKID, 2, DZ, ERRFLG)
       call sysfnc('AX', MKID, 2, AX, ERRFLG)
       call sysfnc('AY', MKID, 2, AY, ERRFLG)
       call sysfnc('AZ', MKID, 2, AZ, ERRFLG)

       RESULT(2) = DX
       RESULT(3) = DY
       RESULT(4) = DZ
       RESULT(6) = AX
       RESULT(7) = AY
       RESULT(8) = AZ

       RETURN
       END
Listing 4.20 C/C++ code for Request
 #include "stdafx.h"
 #include "DllFunc.h"

 Request_API void __cdecl request_usub
   (double time, double upar[], int npar, int iflag, double result[8])
 {
   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)
   //   iflag  : When RD/Solver initializes arrays, the flag is true. (Input)
   //   result : Returned values. (Output, Size : 8)

   // User Statement
   double DX, DY, DZ, AX, AY, AZ;
   int mid[2], ERRFLG, i;

   mid[0] = (int)upar[0];
   mid[1] = (int)upar[1];

   for(i=0;i<8;i++){
     result[i] = 0.0;
   }

   sysfnc("DX",mid,2,&DX,&ERRFLG);
   sysfnc("DY",mid,2,&DY,&ERRFLG);
   sysfnc("DZ",mid,2,&DZ,&ERRFLG);
   sysfnc("AX",mid,2,&AX,&ERRFLG);
   sysfnc("AY",mid,2,&AY,&ERRFLG);
   sysfnc("AZ",mid,2,&AZ,&ERRFLG);

   result[1] = DX;
   result[2] = DY;
   result[3] = DZ;
   result[5] = AX;
   result[6] = AY;
   result[7] = AZ;
 }