Trick provides a state integration capability described by the inputs below. To use these options a developer must develop application code which interfaces the application states with the Trick integration services. The integration job class is designed to accommodate the application state to Trick integration service interface. All integration class jobs must return an integer value which represents the current integration pass identifier. If all integration passes are complete, the job must return a zero. The code below represents a simple integration job implementation. ``` /*********** TRICK HEADER ************** PURPOSE: (State Integration Job) ... CLASS: (integration) ... */ #include "ip_state.h" #include "sim_services/Integrator/include/integrator_c_intf.h" int integration_test( IP_STATE* s) { int ipass; /* LOAD THE POSITION AND VELOCITY STATES */ load_state( &s->pos[0], &s->pos[1], &s->vel[0], &s->vel[1], NULL ); /* LOAD THE POSITION AND VELOCITY STATE DERIVATIVES */ load_deriv( &s->vel[0], &s->vel[1], &s->acc[0], &s->acc[1], NULL ); /* CALL THE TRICK INTEGRATION SERVICE */ ipass = integrate(); /* UNLOAD THE NEW POSITION AND VELOCITY STATES */ unload_state( &s->pos[0], &s->pos[1], &s->vel[0], &s->vel[1], NULL ); /* RETURN */ return(ipass); } ``` The integrate() function, declared externally, is the function which physically integrates the states. This function uses the input parameters defined in Table 18 and 19 to integrate any set of states and derivatives. First, the states must be loaded, load_state() . Notice in the example code that both position and velocity are loaded into the state array. This is because the integrators are primarily 1st order differential equation integrators, which means that velocities are integrated to positions independently from the accelerations being integrated to velocities. Hence, the velocity is a state and the acceleration is its derivative, just as the position is a state and velocity is its derivative. From the 2 degree of freedom code example, there are four states: two position and two velocity. Next, the derivative of the position (velocity) and the derivative of the velocity (acceleration) must be loaded, load_deriv() . The integration job class is designed to be called once for each intermediate pass of a multi-pass integrator. For example the Runge_Kutta_4 integrator will make 4 separate derivative evaluations and stores the resulting state from each intermediate pass separately so that they may be combined and weighted to create a "true" state for the specified time step. The intermediate_step parameter defines the current intermediate step ID for the integrator. This parameter is initialized to zero by the executive and managed by the integrate() function. With the states and derivatives loaded into the appropriate integrator arrays, the integrate() function must be called to integrate the states through a single intermediate step of the selected integration scheme. The integrated states must then be unloaded, unload_state() . If a developer wishes to use their own integration scheme, then the integrate() function source code should be reviewed so that the proper interfaces can be maintained. The integrate() source code is located in the ${TRICK_HOME}/trick_source/sim_services/integ/integrate.c file. ### Integrator Control Inputs There can be any number of integration class jobs listed within the S_define file; each integration job should have an associated IntegLoop declaration. The available inputs for state integration control are listed in Table 18. Table 18 State Integration Control Inputs
Name Default Description
getIntegrator(Integrator_type, unsigned int, double) No default value Tell Trick the Integrator scheme and the number of state variables. A call to this function is required otherwise a runtime error is generated.
set_first_step_deriv(bool) True True=perform derivative evaluation for the first pass of the integrator; False=use the derivative evaluation from the last pass of the previous integration cycle.
set_last_step_deriv(bool) False True=perform derivative evaluation for the last pass of the integrator; False=do not perform derivative evaluation for the last pass of the integrator.
- getIntegrator(Alg, State_size, Dt) : The Alg parameter is an enumerated type which currently has nine possible values. These values and information about the associated integrator is shown in Table 19. The State_size parameter is the number of states that are to be integrated. This includes position and velocity states; e.g. for a three axis translational simulation, there would be three position states and three velocity states, hence the second parameter would equal 6 states. The Dt parameter is the integration frequency; however, this parameter is ignored unless using the Integration class stand-alone. The frequency is defined in the S_define when using integration within Trick. - set_first_step_deriv(first_step) : The first_step parameter is a boolean. If True then Trick will run the derivative jobs for the first integration step. If False then Trick will run only the integration jobs for the first integration step. - set_last_step_deriv(last_step) : The last_step parameter is a boolean. If True then Trick will run the derivative jobs after the last integration step. If False then Trick will not run the derivative jobs after the last integration step. Table 19 State Integration Options
Option Accuracy DiffEQ # Deriv Comments
Euler 1st Order 1st Order 1 yn + 1 = yn + y'n*dt
Euler_Cromer 2nd Order 2nd Order 2 yn + 1 = yn + y'n + 1*dt
ABM_Method Adams-Bashforth-Moulton Predictor Corrector
Nystrom_Lear_2 2nd Order 2nd Order 1 4th order accuracy for orbital state propagation, circular motion
Runge_Kutta_2 2nd Order 2nd Order 2 Good general purpose integrator
Modified_Midpoint_4 4th Order 2nd Order 3 Good accuracy with less derivative evaluations, be careful with high frequency statesr
Runge_Kutta_4 4th Order 1st Order 4 Good general purpose integrator, although a little time consuming
Runge_Kutta_Gill_4 4th Order 1st Order 4 Good general purpose integrator, although a little time consuming
Runge_Kutta_Fehlberg_45 5th Order 1st Order 6 Designed for larger time steps and smooth states, orbital state propagator
Runge_Kutta_Fehlberg_78 8th Order 1st Order 12 Designed for larger time steps and smooth states, orbital state propagator
User_Defined N/A N/A N/A Used to bypass trick integration utilities
The Option column are the integration algorithm options. The Accuracy column gives the order of accuracy for the integrator. The DiffEQ column gives the order of teh differential equation set the integrator formulation assumes. For example, a 1st order DiffEQ integrator integrates accelerations to velocities independently of the velocity to position integration. However, a 2nd order DiffEQ integrator integrates the velocity to position states dependent on the acceleration to velocity state integration. The # Deriv column specifies the number of derivative evaluations performed to integrate across a full time step (also known as the number of integration passes). The Comments column gives some special notes for the usage of each integrator. [Continue to Frame Logging](Frame-Logging)