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