Exemple #1
0
 //determines if we need to enqueue a new signal and calculate
 //the next occurence of this Event type
 internal bool IsNow(double t)
 {
     if (nextTime > t) // have not yet reached next occurence of this Event, so just
         return false;
     // otherwise, Event has occurred
     if (nextGVValues != null)
         for (int j = 0; j < nextGVValues.Length; j++)
             oldGVValues[j] = nextGVValues[j];
     SignalPs s = new SignalPs(); //create next occurence of Event in signal list
     s.parameters[0]=sP1;
     s.parameters[1]=sP2;
     s.parameters[2]=sP3;
     s.parameters[3]=sP4;
     int i = 0;
     foreach (GV gv in GVs) //generate next GV values and signal parameters
     {
         int v = gv.nextValue();
         nextGVValues[i++] = v;
         if (gv.dType == GV.DependencyType.Coeff) s.parameters[0] *= gv.poly.evaluate((double)v);
         else if (gv.dType == GV.DependencyType.Damp) s.parameters[1] *= gv.poly.evaluate((double)v);
         else if (gv.dType == GV.DependencyType.Freq) s.parameters[2] *= gv.poly.evaluate((double)v);
     }
     if (oType == OccType.Periodic)
         nextTime += oP1;
     else if (oType == OccType.Uniform)
         nextTime += Utilities.UniformRND(oP1, oP2);
     else //Gaussian
     {
         double dT;
         do
             dT = Utilities.GaussRND(oP1, oP2);
         while (dT <= 0D); // can't go back into past!
         nextTime += dT;
     }
     s.time = t - nextTime;
     times.Add(s);
     return true;
 }
        internal Event createEventEntry(Parameters p)
        {
            Event ev = new CreateBDFFile.Event();

            if (GVPanel.Items.Count != 0)
            {
                ev.nextGVValues = new int[GVPanel.Items.Count];
                ev.oldGVValues = new int[GVPanel.Items.Count];
            }
            else
                ev.nextGVValues = ev.oldGVValues = null;

            SignalPs s = new SignalPs();
            ev.times.Add(s);
            if ((bool)PeriodicRB.IsChecked) // Periodic event
            {
                ev.oType = Event.OccType.Periodic;
                ev.oP1 = Convert.ToDouble(period.Text);
                ev.nextTime = Utilities.UniformRND(0D,ev.oP1); //make first time random
            }
            else if ((bool)GaussianRB.IsChecked) // Random, Gaussian distribution
            {
                ev.oType = Event.OccType.Gaussian;
                ev.oP1 = Convert.ToDouble(GMean.Text);
                ev.oP2 = Convert.ToDouble(GSD.Text);
                ev.nextTime = Utilities.GaussRND(ev.oP1,ev.oP2); //schedule first occurence
            }
            else // Random, uniform distribution
            {
                ev.oType = Event.OccType.Uniform;
                ev.oP1 = Convert.ToDouble(UMin.Text);
                if (ev.oP1 < 0D) ev.oP1 = 0D;
                ev.oP2 = Convert.ToDouble(UMax.Text);
                ev.nextTime =Utilities.UniformRND(ev.oP1, ev.oP2); //schedule first occurence
            }
            s.time = -ev.nextTime;
            if ((bool)SNone.IsChecked) ev.sType = Event.SignalType.None;
            else if ((bool)SImpulse.IsChecked)
            {
                ev.sType = Event.SignalType.Impulse;
                ev.sP1 = Convert.ToDouble(BW.Text);
            }
            else // damped sinusoid
            {
                ev.sType = Event.SignalType.DampedSine;
                ev.sP1 = Convert.ToDouble(DSCoef.Text);
                ev.sP2 = Convert.ToDouble(DSDamp.Text);
                ev.sP3 = Convert.ToDouble(DSFreq.Text);
                ev.sP4 = Convert.ToDouble(DSPhase.Text);
            }
            ev.GVs = new List<GV>();
            s.parameters[0] = ev.sP1;
            s.parameters[1] = ev.sP2;
            s.parameters[2] = ev.sP3;
            s.parameters[3] = ev.sP4;
            int i = 0;
            foreach (GVEntry gve in GVPanel.Items)
            {
                GV gv = gve.createGV();
                int v = gv.nextValue();
                ev.nextGVValues[i++] = v;
                if (gv.dType == GV.DependencyType.Coeff) s.parameters[0] *= gv.poly.evaluate((double)v);
                else if (gv.dType == GV.DependencyType.Damp) s.parameters[1] *= gv.poly.evaluate((double)v);
                else if (gv.dType == GV.DependencyType.Freq) s.parameters[2] *= gv.poly.evaluate((double)v);
                ev.GVs.Add(gv);
            }
            return ev;
        }