4.8.3.64. GETFINISHFLAG

The GETFINISHFILE subroutine returns 0 during analysis and returns 1 after finishing analysis. (This subtroutine can be used for closing a file opened internally)

Table 4.173 Function Name

Language type

Subroutine

FORTRAN

getfinishflag (iendflag)

C/C++

getfinishflag(&iendflag)

Table 4.174 Parameter information

Variable Name

Size

Description

iendflag

int

The output variable, when the end of analysis is reached, this flag is set.

Listing 4.85 Fortran code for GETFINISHFILE
 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
       integer flagEnd
       integer iunitFile

 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)

 C---- OPEN FILE
       iunitFile = 901
       IF (IFLAG)
     &   OPEN(unit=iunitFile, FILE='test_result.txt', IOSTAT=ivar)

 C---- write in FILE
       write(iunitFile,*) 'Result =', RESULT

 C---- CLOSE FILE
       call GETFINISHFLAG(flagEnd)
       if (flagEnd) then
         close(iunitFile)
       endif
       RETURN
       END
Listing 4.86 C/C++ code for GetFinishFlag
 #include "stdafx.h"
 #include "DllFunc.h"
 #include <stdio.h>
 #include <stdlib.h>

 int fCloseProgram = 0;
 int fInitial[2] = { 1, 1 };
 int nString[2] = { 0 };
 char* pString[2];
 FILE* pFileOutput[2];

 RecurDynUserSubRoutinewizard1_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 Varialbe Definition
   int mkid[3], errflg, akispl_id;
   double disp, value[3], stepsize;
   int finish, convergenceFlag;
   char sName[256];
   int nName;
   int iString;
   int szTCHAR;
   unsigned long long szAllocated;
   int err = 0;
   char FileName[256][2];

   if( fCloseProgram == 1)
   {
     return;
   }

   getcurrententityname(sName,&nName,&errflg);
   getstepsize( &stepsize );
   getfinishflag( &finish );
   getconvergenceflag( &convergenceFlag);


   // Assign Impact Parameters
   mkid[0] = (int) upar[0];
   mkid[1] = (int) upar[1];
   mkid[2] = (int) upar[2];
   akispl_id = (int) upar[3];
   iString= (int) upar[4];; // 0 or 1

   if(fInitial[iString] == 1)
   {
     fInitial[iString] = 0;

     getstringlength(iString,&nString[iString],&errflg);
     szTCHAR = sizeof(char);
     szAllocated = (unsigned long long)nString[iString]*szTCHAR;
     pString[iString] = (char*)malloc(szAllocated);

     getstring(iString,pString[iString],&nString[iString],&errflg);
     sprintf_s( FileName[iString], 255 ,"%s.txt",pString[iString]);
     err = fopen_s(&pFileOutput[iString], FileName[iString], "w");
   }

   if(finish == 1)
   {
     fCloseProgram = 1;
     free(pString[iString]);
     fclose(pFileOutput[iString]);
   }
   else
   {
     getstring(iString,pString[iString],&nString[iString],&errflg);
     fprintf(pFileOutput[iString],"%s\n",pString[iString]);
   }

   if(convergenceFlag == 1)
   {
     convergenceFlag = 0;
   }

   if( strncmp(sName,"Axial1",nName) == 0)
   {
     // Call the Auxiliary subroutines for Calculation
     sysfnc("DX", mkid, 3, &disp, &errflg);
     rd_akispl(disp, 0, akispl_id, 0, value, &errflg);
   }
   else
   {
     // Call the Auxiliary subroutines for Calculation
     sysfnc("DY", mkid, 3, &disp, &errflg);
     rd_akispl(disp, 0, akispl_id, 0, value, &errflg);
   }

   // Assign the Returned Value
   *result = value[0];
 }