/** * @anchor IntegratorPage * @page LEVEL2 Integrators * * Integration is a numerical process of accumulating change. It is commonly used to propagate simulation states from one * time step to the next. * * Trick's integration scheme helps a simulation developer to perform integration, using one of many well-known integration * algorithms or to define his own. * * To do this, Trick defines two job classes specifically for integration: * 1) Derivative Class Job * 2) Integration Class Job * * At initialization time, the job scheduler runs all derivative jobs once. During run-time, Derivative and Integration class * jobs are then alternately executed one or more times at the top of the rate group frame. The integration algorithm chosen * by the user determines the number of times that they are executed per frame. For example, for Runge-Kutta 2 they will * alternately be called 2 times. * * @section LEVEL3 Derivative Class Job * * The user implements derivative class job functions which are expected to calculate derivatives (to be integrated). Derivative * job functions may pass any number of arguments. They may also be written to return any value. Their return value is irrelevant * to the scheduler. The unique feature of a derivative class job is how it's scheduled. It is always called right before * integration class job(s) in the same sim_object. * *@section LEVEL3 Integrator Class Job * * The user also implements integration class jobs functions which are expected to integrate the derivatives calculated by the * derivative class jobs in the same sim object. Like derivative job functions, integration job functions may take any number * of arguments. But, the return value of an integration function is significant. * * A non-zero return value tells the job scheduler ( see exec_scheduled_modules(), in S_source.c) that integration is not yet * complete, and that the derivative and integration class job functions should again be called for the current (t) frame. * A zero return value means that integration is complete for the current frame. * * @section LEVEL3 Integrator integrate() Function Interface * * To aid in the implementation of an integration job function, Trick provides the integrate() function: * int integrate() ; * * The Integrator object stores the input (derivative) values to be integrated, intermediate values, and the resultant * (integrated) values. * * To use integrate(), the user is expected to: -# Declare an IntegLoop in the S_define with the frequency the integration/derivative jobs. -# Call getIntegrator(< Integration Algorithm >, <# of variables to integrate>) in the input file for each IntegLoop. -# In the integration class job:
i. Populate the Integrator object with the state-values: load_state( , ..., NULL); ii. and state-derivative values: load_deriv( , ..., NULL); iii. call the Trick integrate() function: = integrate(); iv. unload the results from: unload_state(integrate() function. * * Each time integrate() is called it will make progress in its estimate of the new state. * * That progress is recorded in the element Integrator->state_ws. After calling integrate(), a non-zero value * in Integrator->intermediate_step, indicates that the integration is not yet complete; that integrate() needs * to be called again. A zero value in Integartor->intermediate_step means that integration is done. The integration algorithms * available are listed in the table below. *
Integration Algorithm
Euler
Euler_Cromer
Nystrom_Lear_2
Runge_Kutta_2
Modified_Midpoint_4
Runge_Kutta_4
Runge_Kutta_Gill_4
Runge_Kutta_Fehlberg_45
Runge_Kutta_Fehlberg_78
ABM_Method
* *@section LEVEL3 Derivative and Integration Class Job Scheduling * * Derivative and Integration class jobs are scheduled/called by the IntegLoop Scheduler to which they are assigned. * * A new IntegLoopScheduler class is created for each IntegLoop defined in the S_define. The sim_objects that are * assigned to the IntegLoopScheduler are added to the scheduler with a call to add_sim_object(). Each * IntegLoopScheduler is registered with the Executive when the default_data class jobs are run. Also, rebuild_jobs() * is called to add jobs to the proper queue for each sim_object assigned to the IntegLoopScheduler during default_data * class jobs. When the initialization class jobs are run, all of the derivative class jobs will be run at time equals 0. * Based on the user-defined fequency, the Executive calls the appropriate IntegLoopScheduler integrate() function. * @section LEVEL4 IntegLoopScheduler Integrate() Function Design * * The following happens for each IntegLoopScheduler integrate() function call: * - All pre-integration class jobs are called. * - If the variable first_step_deriv is TRUE, then all derivative class jobs are called. * - Call all integration class jobs, each integration class job will be called repeatedly until the specific integration * algorithm returns a zero value. * - Call all derivative class jobs. * - Call the dynamic_event class jobs. * * @section LEVEL3 Integration Algorithms * * The specific Integrators that Trick supports are listed in the above table. Each of these integration algorithms * is well known in the world of numerical methods and therefore will not be described. The implementation of the * algorithms are included in Trick release packages, but are not maintained by Trick. The ER7 division maintains * an er7_utils configuration that contains the integrator code that is used by Trick. * @see Trick::Integrator * */