4.8.3.37. GET_RFLEX_MCOOR
The Get_rflex_mcoor subroutine returns the modal coordinates of a selected RFlex body in the current simulation time. This is an auxiliary subroutine for MODAL_FORCE.
Language type |
Subroutine |
FORTRAN |
call get_rflex_mcoor (ifbody, mc, errflg) |
C/C++ |
get_rflex_mcoor (ifbody, mc, &errflg) |
Variable Name |
Size |
Description |
ifbody |
int |
Sequential id of RFlex body defined in RecurDyn/Solver. This is a related argument with the 5th argument of MODAL_FORCE subroutine |
mc |
double |
An array of double precision type. The array size are must be the number of selected modes (=nmode) in the property page of RFlex body. The nmode is a related argument with the 9th argument of MODAL_FORCE subroutine. This argument is the modal coordinate result of a selected RFlex body in the current simulation time. |
errflg |
int |
Error flag.
If the result of this argument is -1
(means TRUE in Fortran logical value),
there is no error.
The others mean that there is an error.
|
#include "stdafx.h"
#include "DllFunc.h"
#include <stdio.h>
Get_rflex_mcoor_API void __cdecl modal_force
(int id, double time, double upar[], int npar, int ifbody, double pos[12],
double vel[6], double acc[6], int nmode, int nnode, int nModalLoad, double *ModalLoads,
int jflag, int iflag, double *result)
{
using namespace rd_syscall;
// Parameter Information
// id: MFORCE ID (Input)
// time: Simulation time of RD/Solver (Input)
// upar: Parameters defined by user (Input)
// npar: Number of user parameters (Input)
// ifbody : RFLEX body seq ID (Input)
// pos : Position(1~3) and Orientation matrix (4~12) w.r.t Ground.InertiaMarker (Input)
// vel : Velocity vector w.r.t. Ground.InertiaMarker (Input)
// acc : Acceleration vector w.r.t Ground.InertiaMarker (Input)
// nmode : No of selected mode (Input)
// nnode : No of node (Input)
// nModalLoad : No of selected modal load cases (Input)
// ModalLoads : Modal-force vector (Input, size : [(6+nmode) x nModalLoad] )
// 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 modal force vector (Output, Size : [6+nmode] )
int i,ierr;
double *MC=NULL; // Modal coordinate
double *MVel=NULL; // Modal velocity
double *MAcc=NULL; // Modal acceleration
int *SelectedModeIds=NULL;
static int Wflag=0;
static double settime=-0.1;
FILE* MCwrite;
if(iflag)
{
MCwrite=fopen("ModalCoordinate_C.txt","w");
fprintf(MCwrite,"*** C program \n");
// RFLEX Information
fprintf(MCwrite,"*** RFLEX Information\n");
fprintf(MCwrite," RFLEX body seq. Id = %d\n",ifbody);
fprintf(MCwrite," No. selected mode = %d\n",nmode);
fprintf(MCwrite," No. Modal Load Case = %d\n",nModalLoad);
fprintf(MCwrite," No. Node(Grid) = %d\n",nnode);
fprintf(MCwrite," No. User Parameter (USUB) = %d\n",npar);
fprintf(MCwrite,"\n\n");
// selected mode information
SelectedModeIds = new int[nmode];
get_rflex_modeid(ifbody,SelectedModeIds,&ierr);
fprintf(MCwrite,"*** Modal Coordinate and Velocity and Acceleration\n");
fprintf(MCwrite," Time ");
for(i=0;i<nmode;i++)
fprintf(MCwrite," MC%d ",SelectedModeIds[i]);
for(i=0;i<nmode;i++)
fprintf(MCwrite," MV%d ",SelectedModeIds[i]);
for(i=0;i<nmode;i++)
fprintf(MCwrite," MA%d ",SelectedModeIds[i]);
fprintf(MCwrite,"\n");
fclose(MCwrite);
}
MCwrite=fopen("ModalCoordinate_C.txt","a+");
for(i=0;i<6+nmode;i++)
{
result[i] = 0.0;
}
if(!jflag && !iflag)
{
Wflag++;
if(Wflag == 2 && settime == time) // Final caclulation for Report
{
// allocated memory
MC = new double[nmode];
MVel = new double[nmode];
MAcc = new double[nmode];
get_rflex_mcoor(ifbody,MC,&ierr);
get_rflex_mvel(ifbody,MVel,&ierr);
get_rflex_macc(ifbody,MAcc,&ierr);
fprintf(MCwrite," %20.10e ",time);
for(i=0;i<nmode;i++)
{
fprintf(MCwrite," %20.10e ",MC[i]);
}
for(i=0;i<nmode;i++)
{
fprintf(MCwrite," %20.10e ",MVel[i]);
}
for(i=0;i<nmode;i++)
{
fprintf(MCwrite," %20.10e ",MAcc[i]);
}
fprintf(MCwrite,"\n");
// deallocate memory
delete [] MC;
delete [] MVel;
delete [] MAcc;
}
settime = time;
}
if(jflag) Wflag = 0;
fclose(MCwrite);
}