コード例 #1
0
        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);
        }
コード例 #2
0
 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());
     }
 }