4.8.3.104. SYSFNC

SYSFNC subroutine returns a single value when it is invoked by

Table 4.253 Function Name

Language type

Subroutine

FORTRAN

call sysfnc(what, mkid, nid, result, errflg)

C/C++

sysfnc(what, mkid, nid, & result , &errflg)

Where FX is the type for SYSFNC subroutine, mkid and nid must be defined as an integer array and integer. The force_x must be defined as the double precision. The errflg must be defined as a logical variable in FORTRAN language or an integer in C/C++ language.

Table 4.254 Parameter information

Variable Name

Size

Description

what

char [30]

The type name. Type needs quotation marks such as ‘FX’ in fortran code, and double quotation marks such as “FX”.

mkid

int*

The ID array of marker.

nid

int

The number of marker in mkid array.

result

double

The Result value. Check the TYPE FOR SYSFNC.

errflg

logical

If an error is encountered in invoking Predefined subroutine, this variable becomes true. This variable must be declared as a logical variable.

The available types are tabulated in SYSFNC as follows.

TYPES FOR SYSFNC

  • DISPLACEMENT ELEMENTS

TYPE

DISPLACEMENT ELEMENTS

FUNCTION NAME

DM, DX, DY, DZ, AX, AY, AZ, PSI, THETA, PHI, YAW, PITCH, ROLL

  • VELOCITY ELEMENTS

TYPE

VELOCITY ELEMENTS

FUNCTION NAME

VM, VR, VX, VY, VZ, WM, WX, WY, WZ

  • ACCELERATION ELEMENTS

TYPE

ACCELERATION ELEMENTS

FUNCTION NAME

ACCM, ACCX, ACCY, ACCZ, WDTM, WDTX, WDTY, WDTZ

  • FORCE ELEMENTS

TYPE

FORCE ELEMENTS

FUNCTION NAME

FM, FX, FY, FZ, TM, TX, TY, TZ

  • SUB ELEMENTS

TYPE

SUB ELEMENTS

FUNCTION NAME

DIF, DIF1, VARVAL, EXPVAL

Note

The SYSFNC function should be called every time in the user subroutine. Because the mkid used in the SYSFNC function is registered only one time initially. Using SYSFNC within if statement is highly unrecommended.

Note

In case of DIF, DIF1, VARVAL and EXPVAL, below is the parameters and meaning.
DIF [C/C++] sysfnc(“DIF”,id,1,&returnvalue, &errflg)
DIF1 [C/C++] sysfnc(“DIF1”,id,1,&returnvalue, &errflg)
VARVAL [C/C++] sysfnc(“VARVAL”,id,1,&returnvalue, &errflg)
EXPVAL [C/C++] sysfnc(“EXPVAL”,id,1,&returnvalue, &errflg)
id: UPAR: Variable Expression Name
return value:
DIF = The Value of the State Variable which is used in a differential equation
DIF1 = The Time Derivative of the State Variable which is used in a differential equation
VARVAL = Return Value of the State Variable which is used in a variable equation
EXPVAL = Return Value of the expression
errflg: 1 success, 0 fail.
Listing 4.114 Fortran code for SYSFNC
 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
 C     upar: Parameters defined by user
 C     npar: Number of user parameters
 C     jflag: When RD/Solver evaluates a Jacobian, the flag is true.
 C     iflag: When RD/Solver initializes arrays, the flag is true.
 C     result: Returned value

       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.115 C/C++ code for SYSFNC
 #include "stdafx.h"
 #include "DllFunc.h"

 Test_USUB_axial_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
   //   upar: Parameters defined by user
   //   npar: Number of user parameters
   //   jflag: When RD/Solver evaluates a Jacobian, the flag is true.
   //   iflag: When RD/Solver initializes arrays, the flag is true.
   //   result: Returned value

   // User statement
   // Local Variable 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];
 }