1
2
3
4
5
6
7
8
9
10 package nl.tudelft.simulation.dsol.simulators;
11
12 import java.rmi.RemoteException;
13
14 import nl.tudelft.simulation.dsol.SimRuntimeException;
15 import nl.tudelft.simulation.dsol.eventlists.EventListInterface;
16 import nl.tudelft.simulation.dsol.eventlists.RedBlackTree;
17 import nl.tudelft.simulation.dsol.experiment.Replication;
18 import nl.tudelft.simulation.dsol.experiment.TimeUnit;
19 import nl.tudelft.simulation.dsol.experiment.TimeUnitInterface;
20 import nl.tudelft.simulation.dsol.formalisms.devs.SimEvent;
21 import nl.tudelft.simulation.dsol.formalisms.devs.SimEventInterface;
22 import nl.tudelft.simulation.event.Event;
23 import nl.tudelft.simulation.logger.Logger;
24
25 /***
26 * The DEVS defines the interface of the DEVS simulator. DEVS stands for the
27 * Discrete Event System Specification. More information on Discrete Event
28 * Simulation can be found in "Theory of Modeling and Simulation" by Bernard
29 * Zeigler et. al.
30 * <p>
31 * (c) copyright 2003 <a href="http://www.simulation.tudelft.nl">Delft
32 * University of Technology </a>, the Netherlands. <br>
33 * See for project information <a href="http://www.simulation.tudelft.nl">
34 * www.simulation.tudelft.nl </a> <br>
35 * License of use: <a href="http://www.gnu.org/copyleft/gpl.html">General Public
36 * License (GPL) </a>, no warranty <br>
37 *
38 * @author <a href="http://www.simulation.tudelft.nl/people/jacobs.html">Peter
39 * Jacobs </a>
40 * @version 1.16 2004-03-18
41 * @since 1.0
42 */
43 public class DEVSSimulator extends Simulator implements DEVSSimulatorInterface
44 {
45
46 /***
47 * eventList represents the future event list
48 *
49 * @uml.property name="eventList"
50 */
51 protected EventListInterface eventList = new RedBlackTree();
52
53
54 /***
55 * @see nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface
56 * #cancelEvent(SimEventInterface)
57 */
58 public boolean cancelEvent(final SimEventInterface event)
59 {
60 return this.eventList.remove(event);
61 }
62
63 /***
64 * @see nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface
65 * #getEventList()
66 *
67 * @uml.property name="eventList"
68 */
69 public EventListInterface getEventList()
70 {
71 return this.eventList;
72 }
73
74
75 /***
76 * @see nl.tudelft.simulation.dsol.simulators.SimulatorInterface
77 * #initialize(nl.tudelft.simulation.dsol.experiment.Replication)
78 */
79 public void initialize(final Replication replication)
80 throws RemoteException, SimRuntimeException
81 {
82 synchronized (super.semaphore)
83 {
84 super.initialize(replication);
85 this.eventList.clear();
86 this.replication.getRunControl().getTreatment().getExperiment()
87 .getModel().constructModel(this);
88 this.scheduleEvent(new SimEvent(this.getReplication()
89 .getRunControl().getRunLength(),
90 (short) (SimEventInterface.MIN_PRIORITY - 1), this, this,
91 "stop", null));
92 Object[] args = {new Event(SimulatorInterface.WARMUP_EVENT, this,
93 null)};
94 this.scheduleEvent(new SimEvent(this.getReplication()
95 .getRunControl().getWarmupPeriod(),
96 (short) (SimEventInterface.MAX_PRIORITY + 1), this, this,
97 "fireEvent", args));
98 }
99 }
100
101 /***
102 * @see nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface
103 * #scheduleEvent(SimEventInterface)
104 */
105 public void scheduleEvent(final SimEventInterface event)
106 throws SimRuntimeException
107 {
108 synchronized (super.semaphore)
109 {
110 if (event.getAbsoluteExecutionTime() < super.simulatorTime
111 || new Double(event.getAbsoluteExecutionTime()).isNaN())
112 {
113 throw new SimRuntimeException("cannot schedule event "
114 + event.toString() + " in past " + this.simulatorTime
115 + ">" + event.getAbsoluteExecutionTime());
116 }
117 this.eventList.add(event);
118 Logger.finest(this, "scheduleEvent", "scheduled event at "
119 + event.getAbsoluteExecutionTime());
120 }
121 }
122
123 /***
124 * @see nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface#scheduleEvent(double,
125 * java.lang.Object, java.lang.Object, java.lang.String,
126 * java.lang.Object[])
127 */
128 public void scheduleEvent(double relativeDelay, Object source,
129 Object target, String method, Object[] args)
130 throws SimRuntimeException
131 {
132 this.scheduleEvent(relativeDelay, SimEventInterface.NORMAL_PRIORITY,
133 source, target, method, args);
134 }
135
136 /***
137 * @see nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface#scheduleEvent(double,
138 * short, java.lang.Object, java.lang.Object, java.lang.String,
139 * java.lang.Object[])
140 */
141 public void scheduleEvent(double relativeDelay, short priority,
142 Object source, Object target, String method, Object[] args)
143 throws SimRuntimeException
144 {
145 this.scheduleEvent(new SimEvent(this.simulatorTime + relativeDelay,
146 priority, source, target, method, args));
147 }
148
149 /***
150 * @see nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface#scheduleEvent(double,
151 * nl.tudelft.simulation.dsol.experiment.TimeUnitInterface,
152 * java.lang.Object, java.lang.Object, java.lang.String,
153 * java.lang.Object[])
154 */
155 public void scheduleEvent(double relativeDelay, TimeUnitInterface timeUnit,
156 Object source, Object target, String method, Object[] args)
157 throws RemoteException, SimRuntimeException
158 {
159 this
160 .scheduleEvent(TimeUnit.convert(relativeDelay, timeUnit, this),
161 SimEventInterface.NORMAL_PRIORITY, source, target,
162 method, args);
163 }
164
165 /***
166 * @see nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface#scheduleEvent(double,
167 * nl.tudelft.simulation.dsol.experiment.TimeUnitInterface, short,
168 * java.lang.Object, java.lang.Object, java.lang.String,
169 * java.lang.Object[])
170 */
171 public void scheduleEvent(double relativeDelay, TimeUnitInterface timeUnit,
172 short priority, Object source, Object target, String method,
173 Object[] args) throws RemoteException, SimRuntimeException
174 {
175 this.scheduleEvent(TimeUnit.convert(relativeDelay, timeUnit, this),
176 priority, source, target, method, args);
177 }
178
179 /***
180 * @see nl.tudelft.simulation.dsol.simulators.DEVSSimulatorInterface
181 * #setEventList(EventListInterface)
182 *
183 * @uml.property name="eventList"
184 */
185 public synchronized void setEventList(final EventListInterface eventList)
186 {
187 this.eventList = eventList;
188 Logger.finer(this, "setEventList", "set the eventList to "
189 + eventList.toString());
190 this.fireEvent(EVENTLIST_CHANGED_EVENT, null);
191 }
192
193 /***
194 * @see nl.tudelft.simulation.dsol.simulators.SimulatorInterface#step()
195 */
196 public void step() throws SimRuntimeException
197 {
198 synchronized (super.semaphore)
199 {
200 super.step();
201 if (!this.eventList.isEmpty())
202 {
203 this.running = true;
204 SimEventInterface event = this.eventList.removeFirst();
205 this.simulatorTime = event.getAbsoluteExecutionTime();
206 this.fireEvent(SimulatorInterface.TIME_CHANGED_EVENT,
207 this.simulatorTime, this.simulatorTime);
208 event.execute();
209 this.running = false;
210 }
211 }
212 }
213
214 /***
215 * @see nl.tudelft.simulation.dsol.simulators.Simulator#run()
216 */
217 public void run()
218 {
219 while (isRunning())
220 {
221 synchronized (super.semaphore)
222 {
223 SimEventInterface event = this.eventList.removeFirst();
224 this.simulatorTime = event.getAbsoluteExecutionTime();
225 fireEvent(SimulatorInterface.TIME_CHANGED_EVENT,
226 this.simulatorTime, this.simulatorTime);
227 try
228 {
229 event.execute();
230 } catch (Exception exception)
231 {
232 Logger.severe(this, "run", exception);
233 }
234 }
235 }
236 }
237
238 /***
239 * @see nl.tudelft.simulation.dsol.simulators.SimulatorInterface#stop()
240 */
241 public void stop()
242 {
243 super.stop();
244 if (this.getReplication() != null
245 && this.simulatorTime >= this.getReplication().getRunControl()
246 .getRunLength())
247 {
248 this.eventList.clear();
249 }
250 if (this.eventList.isEmpty())
251 {
252 this.fireEvent(new Event(
253 SimulatorInterface.END_OF_REPLICATION_EVENT, this, null));
254 }
255 }
256 }