The simulation is run by the server as directed by the client.
The code listings are given for the following classes:
The directory path for the package for the Simulation,
SimulationThread, and SimData
classes goes as
javatech
|
|__ all20
|
|__
server
|
|__
impl
Simulation.java
|
package
javatech.all20.server.impl;
//-----------------------------------------------------------------------
// CLASS: Simulation -
/************************************************************************
* This class does the real computational work of the simulation
demo.
************************************************************************/
public class Simulation {
final public static int ABNORMAL = -1;
final public static int NORMAL = 0;
final public static int FORCED_HALT = 1;
private SimData fSimData;
private float fAmp, fOmega, fSpringCons, fDeltaT,
fMaxTime, fMass;
private boolean fKillMe;
//-------------------------------------------------------------------
// CONSTRCUTOR: Simulation -
/********************************************************************
* Constructs a Simulation object.
*******************************************************************/
public Simulation (SimData sd) {
fSimData = sd;
} // ctor
//-------------------------------------------------------------------
// METHOD: initialize -
/********************************************************************
* Initializes the simulation.
*
* @param indata array
of initial simulation data
*******************************************************************/
/** Initialize the simulation. **/
public void initialize (float[] indata) {
fAmp = indata[0];
fOmega = indata[1];
fSpringCons = indata[2];
fDeltaT = indata[3];
fMaxTime = indata[4];
fMass = fSpringCons/(fOmega*fOmega);
} // initialize
//-------------------------------------------------------------------
// METHOD: halt -
/********************************************************************
* Halts the simulation by setting a flag that
will be periodically
* checked by the running simulation code.
*******************************************************************/
public void halt () { fKillMe = true; }
//-------------------------------------------------------------------
// METHOD: startRunning -
/********************************************************************
* Start calculating the simulation results.
*******************************************************************/
public int startRunning () {
fKillMe = false;
int status = ABNORMAL; // leave
abnormal until reset
float time = 0.f;
int iter = 0;
float[] data = new float[SimData.OUTSIZE];
float[] new_indata = new float[SimData.INSIZE];
int num_data_stores = 0;
// Keep running until the fKillMe
flag becomes true.
while (!fKillMe) {
time = iter * fDeltaT;
if (time <= fMaxTime)
{
// Simulate
a long-running calculation by sleeping for 100 ms.
try {
Thread.sleep
(100);
}
catch (InterruptedException
ie) {/*ignore*/}
// Populate
the output data array
// time
data[0]
= time;
// Calculated
values:
// position
= A * sin (omega*t)
data[1]
= fAmp * (float) Math.sin (fOmega * time);
// velocity
= omega*A * cos (omega*t)
data[2]
= fOmega * fAmp * (float) Math.cos (fOmega * time);
// acceleration
= -omega**2 * A * sin (omega*t) = -omega**2 * x
data[3]
= -fOmega*fOmega * data[1];
// kinetic
energy = 1/2 * m * v**2
data[4]
= .5f * fMass * data[2]*data[2];
// potential
energy = 1/2 * k * x**2
data[5]
= .5f * fSpringCons * data[1]*data[1];
System.err.println
("storing " + data[1] + " " + data[2] + " " +
data[3]
+ " " + data[4] + " " + data[5] + " at " + data[0]);
new_indata
= fSimData.storeData (data);
fAmp = new_indata[0];
fOmega =
new_indata[1];
fSpringCons
= new_indata[2];
num_data_stores++;
// If the
control flag in new_indata[5] == 1, halt the simulation.
if ((int)new_indata[5]
== 1) halt();
}
else {
System.err.println
(
"Simulation: time exceeds max, storing negative
time and ending simulation");
data[0]
= -time;
data[1]
= -999.999f;
fSimData.storeData
(data);
status =
NORMAL;
break;
}
iter ++;
} // while !fKillMe
// If exiting because of the fKillMe
flag, set data[0] and data[1]
// to special values indicating
a forced termination.
if (fKillMe) {
data[0] = -100.f;
data[1] = -100.f;
System.err.println ("storing
-100 -100 for FORCED_HALT");
fSimData.storeData (data);
status = FORCED_HALT;
}
System.err.println ("Total valid
data stores = " + num_data_stores);
return status;
} // startRunning
} // Simulation
|
SimulationThread.java
|
package
javatech.all20.server.impl;
//-----------------------------------------------------------------------
// CLASS: SimulationThread -
/************************************************************************
* This is the thread that runs the simulation.
************************************************************************/
public class SimulationThread extends Thread {
private Simulation fSimulation;
//-------------------------------------------------------------------
// CONSTRCUTOR: SimulationThread -
/********************************************************************
* Constructs a SimulationThread object.
*******************************************************************/
public SimulationThread (SimData simData) {
fSimulation = new Simulation (simData);
} // ctor
//-------------------------------------------------------------------
// METHOD: halt -
/********************************************************************
* Halts the simulation.
*******************************************************************/
void halt () { fSimulation.halt(); }
//-------------------------------------------------------------------
// METHOD: initialize -
/********************************************************************
* Initializes the simulation.
*******************************************************************/
public void initialize (float[] initdata) {
fSimulation.initialize (initdata);
} // initialize
//-------------------------------------------------------------------
// METHOD: run -
/********************************************************************
* Starts the simulation running.
*******************************************************************/
public void run () {
// Start the simulation running. The
simulation will continue to run
// until the end time is reached or
it is forced to halt with the halt()
// method or it quits abnormally.
This return status is not presently
// being used.
int status = fSimulation.startRunning
();
String stat = status == Simulation.NORMAL
? "NORMAL" :
status == Simulation.FORCED_HALT ? "FORCED HALT":
status == Simulation.ABNORMAL ? "ABNORMAL" :
"REALLY REALLY ABNORMAL!";
System.err.println ("SimulationThread:
simulation finished with status " +
status + " (" + stat + ")");
fSimulation = null;
} // run
} // SimulationThread |
SimData.java
|
package
javatech.all20.server.impl;
//-----------------------------------------------------------------------
// CLASS: SimData -
/************************************************************************
* Stores and retrieves simulation data arrays.
************************************************************************/
public class SimData {
final public static int INSIZE = 6;
final public static int OUTSIZE = 6;
private float[] fInData;
private float[] fOutData;
//-------------------------------------------------------------------
// CONSTRCUTOR: SimData -
/********************************************************************
* Constructs a SimData object.
*******************************************************************/
/** ctor **/
public SimData () {
fInData = new float [INSIZE];
fOutData = new float [OUTSIZE];
//fOutData[0] = -1.f;
} // ctor
//-------------------------------------------------------------------
// METHOD: storeData -
/********************************************************************
* Stores an array of data and returns the current
input data set.
*
* @param data array of
data to be stored
*******************************************************************/
public synchronized float[] storeData (float[]
data) {
System.arraycopy (data, 0, fOutData,
0, OUTSIZE);
return fInData;
} // storeData
//-------------------------------------------------------------------
// METHOD: getResults -
/********************************************************************
* Retrieves the data set most recently stored
with storeData
* while loading a new set of input data.
*
* @param indata new array
of input data
*
* @return array containing the current output
data set
*******************************************************************/
public synchronized float[] getResults (float[]
indata) {
System.arraycopy (indata, 0, fInData,
0, INSIZE);
return fOutData;
} // getResults
} // SimData |
Most recent update: Oct. 14, 2005
|