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.

Table 4.119 Function Name

Language type

Subroutine

FORTRAN

call get_rflex_mcoor (ifbody, mc, errflg)

C/C++

get_rflex_mcoor (ifbody, mc, &errflg)

Table 4.120 Parameter information

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.
Listing 4.64 C/C++ code for GET_RFLEX_MCOOR
 #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);

 }