ssSetSolverNeedsReset

Попросите, чтобы механизм Simulink сбросил решатель

Синтаксис

void ssSetSolverNeedsReset(SimStruct *S)

Аргументы

S

SimStruct, представляющий Блок s-function или Simulink® модель.

Описание

Используйте ssSetSolverNeedsReset макрос, когда изменение происходит в динамике S-функции, которая может влиять на решатель ОДУ. Изменение в качестве примера является разрывом в S-функции непрерывное состояние или разрыв в его выходе, который управляет другими непрерывными блоками. S-функция должна только изменить свой непрерывный вектор состояния в главном временном шаге. Не изменяйте непрерывные значения состояния в незначительных временных шагах.

Разрыв в состоянии или выходе непрерывной S-функции может делать недействительным кэшируемую и производную информацию состояния в решателе ОДУ. Используйте ssSetSolverNeedsReset макрос, чтобы иметь решатель ОДУ повторно инициализирует кэшируемую информацию в следующем этапе интеграции. Непрерывные изменения состояния без сброса решателя небезопасны. Изменение непрерывных состояний, также не используя ssSetSolverNeedsReset макрос может привести к неправильным результатам, потому что решатель ОДУ может проигнорировать эти изменения, чтобы защитить внутреннюю непротиворечивость его данных и результатов интегрирования. Только повторно инициализируйте состояния на главных временных шагах. Алгоритмы интегрирования не ожидают, что векторы состояния изменятся во время незначительных временных шагов.

Примечание

При использовании этого макроса, для проблем эффективности, рассматривают также использование ssSetSkipContStatesConsistencyCheck(S,1) в mdlInitializeSizes метод. ssSetSkipContStatesConsistencyCheck отключает контроль S-функции непрерывные состояния Simulink, улучшая производительность симуляции.

Примечание

Когда симуляция многопоточна, она перескакивает через сброс решателя и игнорирует использование этого макроса.

Языки

C, C++

Пример

Следующий пример использует этот макрос, чтобы попросить, чтобы механизм Simulink сбросил решатель.

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); 
	}
}

Также см. исходный код для Изменяющейся во времени Непрерывной Передаточной функции (stvctf.c) для примера где и как использовать этот макрос.

Представлено до R2006a