private double UpdateState( double tPrev, double t, Vector <double> xPrev, Vector <double> x, Dictionary <string, int> variableMap, ref Equations.DAE.Implicit.DAEIAnalytic system) { double dt = t - tPrev; //for each event interpolate values and update stuff while (events.Count > 0) { TransientEvent _event = events.First <TransientEvent>(); if (_event.Time > t) { return(t); } #if TEST || DEBUG if (_event.Time < tPrev) { throw new Exception("UpdateState exception"); } #endif events.RemoveAt(0); Vector <double> xCurrent = MathUtils.MathUtils.Interpolate(xPrev, x, (_event.Time - tPrev) / dt); TransientState currentState = new TransientState(xCurrent, variableMap); if (_event.Execute(currentState)) { system.UpdateParameters(_event.GetParameters()); double eventTime = _event.Time; while (events.Count > 0) { _event = events.First <TransientEvent>(); if (_event.Time > eventTime) { break; } events.RemoveAt(0); if (_event.Execute(currentState)) { system.UpdateParameters(_event.GetParameters()); } } stateChangedCount++; return(eventTime); } } return(t); }
private void InitEvents(ref Equations.DAE.Implicit.DAEIAnalytic system) { foreach (var element in elements) { if (element is ITransientEventGenerator) { events.AddRange((element as ITransientEventGenerator).GenerateEvents(t0, t1)); } } //sort events by time events.OrderBy(x => x.Time); while (events.Count > 0) { var _event = events.First(); if (_event.Time >= t0) { break; } system.UpdateParameters(_event.GetParameters()); } }