import desmoj.core.simulator.*;
import desmoj.core.dist.*;
import desmoj.core.advancedModellingFeatures.*;
public class SimulationModel extends Model {
private static final int NUM_CUSTOMER_INIT = 4;
private static int SIM_DURATION = 1000; // 1000 takes ~20sec on a Pentium 1.8Ghz (for customers=4)
private static double SIM_TRACE_PERIOD = 10;
private static double SIM_DEBUG_PERIOD = 0;
private static boolean SHOW_PROGRESS_BAR = false;
private RealDistUniform routingProb;
private RealDistExponential cpuServiceTime;
private RealDistExponential disk1ServiceTime;
private RealDistExponential disk2ServiceTime;
Res cpu;
Res disk1;
Res disk2;
Res infiniteServer;
public SimulationModel(Model owner, String modelName, boolean showInReport, boolean showInTrace) {
super(owner, modelName, showInReport, showInTrace);
}
public String description() {
return "This is the Central Server model description,"+
"in a process oriented version with RES objects that HOLD."+
"This model is a central server model where customers(requests) will arrive and "+
"require the service of a CPU, which in turn requests service at one of."+
"two disks. The customer may then leave the system, or get serviced once "+
"more by the CPU. We use an InfiniteServer with no servicetime to get the "+
"Throughput of the system. Simulation time is in seconds";
}
public double getRoutingProb() {
return routingProb.sample();
}
public double getCPUServiceTime() {
return cpuServiceTime.sample();
}
public double getDisk1ServiceTime() {
return disk1ServiceTime.sample();
}
public double getDisk2ServiceTime() {
return disk2ServiceTime.sample();
}
public void doInitialSchedules() {
for (int i=0; i<NUM_CUSTOMER_INIT; i++) { // # of customers in system at simulation start
Customer newCustomer = new Customer(this, "Customer", true);
newCustomer.activate(new SimTime(0.0));
}
}
public void init() {
routingProb = new RealDistUniform(this, "RoutingProbability", 0.0, 1.0, true, false);
routingProb.setNonNegative(true);
cpuServiceTime = new RealDistExponential(this,"CPUServiceTimeStream", 0.01, true, false);
cpuServiceTime.setNonNegative(true);
disk1ServiceTime = new RealDistExponential(this,"Disk1ServiceTimeStream", 0.0125, true, false);
disk1ServiceTime.setNonNegative(true);
disk2ServiceTime = new RealDistExponential(this,"Disk2ServiceTimeStream", 0.020, true, false);
disk2ServiceTime.setNonNegative(true);
cpu = new Res(this, "CPU", 1, true, true);
disk1 = new Res(this, "Disk1", 1, true, true);
disk2 = new Res(this, "Disk2", 1, true, true);
infiniteServer = new Res(this, "InfiniteServer", 1, true, true);
}
public static void main(java.lang.String[] args) {
Experiment exp = new Experiment("centralserver_experiment");
SimulationModel simModel = new SimulationModel(null, "CentralServer Model", true, false);
simModel.connectToExperiment(exp);
exp.setShowProgressBar(SHOW_PROGRESS_BAR);
exp.tracePeriod(new SimTime(0.0),new SimTime(SIM_TRACE_PERIOD) );
exp.debugPeriod(new SimTime(0.0),new SimTime(SIM_DEBUG_PERIOD) );
exp.stop(new SimTime(SIM_DURATION));
exp.start();
exp.report();
exp.finish();
}
}