4.8.3.104. SYSFNC
SYSFNC subroutine returns a single value when it is invoked by
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.
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 |
ACCELERATION ELEMENTS
TYPE |
ACCELERATION ELEMENTS |
FUNCTION NAME |
FORCE ELEMENTS
TYPE |
FORCE ELEMENTS |
FUNCTION NAME |
SUB ELEMENTS
TYPE |
SUB ELEMENTS |
FUNCTION NAME |
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
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
#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];
}