Main Content

ssSetSolverNeedsReset

Ask Simulink engine to reset solver

Syntax

void ssSetSolverNeedsReset(SimStruct *S)

Arguments

S

SimStruct that represents an S-Function block or a Simulink® model.

Description

Use the ssSetSolverNeedsReset macro when a change occurs in the dynamics of the S-function that can affect the ODE solver. An example change is a discontinuity in S-function continuous state or a discontinuity in its output that is driving other continuous blocks. An S-function should only change its continuous state vector in a major time step. Do not change continuous state values in minor time steps.

A discontinuity in a state or output of a continuous S-function can invalidate the cached state and derivative information in the ODE solver. Use the ssSetSolverNeedsReset macro to have the ODE solver reinitialize the cached information in the next integration step. Continuous state changes without solver resets are unsafe. Changing continuous states without also using the ssSetSolverNeedsReset macro can lead to incorrect results because the ODE solver may ignore these changes to protect internal consistency of its data and integration results. Only reinitialize states at major time steps. Integration algorithms do not expect state vectors to change during minor time steps.

Note

When using this macro, for performance issues, consider also using ssSetSkipContStatesConsistencyCheck(S,1) in the mdlInitializeSizes method. ssSetSkipContStatesConsistencyCheck disables the monitoring of S-function continuous states by Simulink, improving simulation performance.

Note

When the simulation is multithreaded, it skips over solver reset and ignores the use of this macro.

Languages

C, C++

Examples

The following example uses this macro to ask the Simulink engine to reset the solver.

static void mdlOutputs(SimStruct *S, int_T tid) 
{ 
	: 
	: <snip> 
	: 
	if ( ssIsMajorTimeStep(S) && YourConditionsForStateChange ) {
		double *x = ssGetContStates(S);
		/* reset the states */ 
		for (i=0; i<nContStates; i++) { 
			x[i] = 0.0; 
		} 
		/* Ask the Simulink engine to reset the solver. */ 
		ssSetSolverNeedsReset(S); 
	}
}

Also see the source code for the Time-Varying Continuous Transfer Function (stvctf.c) for an example of where and how to use this macro.

Version History

Introduced before R2006a