package
javatech.all20.client;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import javatech.all20.server.FactoryInterface;
import javatech.all20.server.ServerInterface;
import javatech.utils.hist.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Client
{
// This name must match the values used by the
server.
//final private static String FACTORY_NAME =
"all20ServerFactory";
// This sets the size of the output data array.
It must match what is used
// by the server.
final private static int OUTSIZE = 6;
// Default values for the simulation parameters.
private float fAmp = 1.f, fOmega=1.f, fSpringCons
= 1.f;
private float fDeltaT=0.1f, fMaxTime=2.f*(float)Math.PI;
private float fControl = 1.f;
private int fNumBins = 21;
private float[] fIndata;
// References to the factory and server.
private FactoryInterface fFactory;
private ServerInterface fServer;
private boolean fReallyQuit;
private Histogram fPositionHist, fVelocityHist,
fTimeHist, fOmegaTimeHist;
private HistPanel fPositionHPan, fVelocityHPan,
fTimeHPan, fOmegaTimeHPan;
private Histogram fKEHist,fPEHist;
private HistPanel fKEPanel, fPEPanel;
private JButton fQuitButton = new JButton ("Quit");
private final boolean DO_TIME_HIST = true;
private final boolean DO_VELOCITY_HIST = true;
private final boolean DO_OMEGA_TIME_HIST = true;
private final boolean DO_KE_HIST = true;
private final boolean DO_PE_HIST = true;
/** ctor **/
public Client () {
fQuitButton.addActionListener (new
ActionListener() {
public void actionPerformed
(ActionEvent ev) {
if (fReallyQuit)
//
If we've been here before, then really quit this time.
System.exit
(0);
else {
//
If not, set the control flag to tell the server to halt
//
the simulation.
fIndata[5]
= 1.f;
fReallyQuit
= true;
fQuitButton.setText
("One more time to exit");
}
} // actionPerformed
});
try {
// Find the server factory.
String host = System.getProperty
("server.host", "localhost");
String port = System.getProperty
("server.port", "3001");
String factory_server
= "//" + host + ":" + port +
"/"+FactoryInterface.FACTORY_NAME;
System.err.println ("Client
ctor: looking up factory " + factory_server);
fFactory = (FactoryInterface)
Naming.lookup (factory_server);
System.err.println ("Client
ctor: got it, getting user.name");
String uid = System.getProperty
("user.name");
System.err.println (
"Client ctor:
uid = " + uid + ", calling factory.getInstance()");
// Get a server instance
from the server factory.
fServer = fFactory.getInstance
(uid);
System.err.println ("Client
ctor: got the server instance");
} // try
catch (MalformedURLException mue)
{
System.err.println (mue);
}
catch (NotBoundException nbe) {
System.err.println (nbe);
}
catch (RemoteException re) {
System.err.println (re);
}
if (fFactory == null || fServer
== null) {
System.err.println ("\nEXITING
BECAUSE OF FAILURE");
System.exit (1);
}
} // ctor
public void setParameters (String[] args) {
switch (args.length) {
case 6:
fNumBins =
Integer.parseInt (args[5]);
case 5:
fMaxTime =
Float.parseFloat (args[4]) * (float) Math.PI;
case 4:
fDeltaT
= Float.parseFloat (args[3]);
case 3:
fSpringCons
= Float.parseFloat (args[2]);
case 2:
fOmega
= Float.parseFloat (args[1]);
case 1:
fAmp =
Float.parseFloat (args[0]);
} // switch
fPositionHist = new Histogram ("Position
(x) ", "", fNumBins, -fAmp, fAmp);
fPositionHPan = new HistPanel (fPositionHist);
JFrame position_frame = new JFrame
("Position Histogram");
position_frame.getContentPane().add
(fPositionHPan);
position_frame.getContentPane().add
(fQuitButton, BorderLayout.SOUTH);
int width = 680;
int height = 380;
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
int x = (screen.width - width) /
2;
int y = (screen.height - height)
/ 3;
position_frame.setBounds(x, y, width,
height);
position_frame.setVisible (true);
if (DO_VELOCITY_HIST) {
JFrame velocity_frame
= new JFrame ("Velocity Histogram");
fVelocityHist = new
Histogram ("velocity", "", fNumBins, -fOmega*fAmp,
fOmega*fAmp);
fVelocityHPan = new
HistPanel (fVelocityHist);
velocity_frame.getContentPane().add
(fVelocityHPan);
velocity_frame.setBounds(700,
0, width, height);
velocity_frame.setVisible
(true);
}
if (DO_KE_HIST) {
JFrame ke_frame;
fKEHist = new Histogram
("KE", "", fNumBins, 0.,
0.5f*fOmega*fOmega*fAmp*fAmp);
fKEPanel = new HistPanel
(fKEHist);
ke_frame = new JFrame
("Kinetic Energy Histogram");
ke_frame.getContentPane().add
(fKEPanel);
ke_frame.setBounds(0,
0, width, height);
ke_frame.setVisible
(true);
}
if (DO_PE_HIST) {
JFrame ke_frame;
fPEHist = new Histogram
("PE", "", fNumBins, 0.,
0.5f*fOmega*fOmega*fAmp*fAmp);
fPEPanel = new HistPanel
(fPEHist);
ke_frame = new JFrame
("Potential Energy Histogram");
ke_frame.getContentPane().add
(fPEPanel);
ke_frame.setBounds(0,
height+100, width, height);
ke_frame.setVisible
(true);
}
if (DO_TIME_HIST) {
JFrame time_frame;
fTimeHist = new Histogram
("t", "", fNumBins, 0., fMaxTime);
fTimeHPan = new HistPanel
(fTimeHist);
time_frame = new JFrame
("Time Histogram");
time_frame.getContentPane().add
(fTimeHPan);
time_frame.setBounds(0,
0, width, height);
time_frame.setVisible
(true);
}
if (DO_OMEGA_TIME_HIST) {
JFrame omega_time_frame;
omega_time_frame = new
JFrame ("Omega Time Histogram");
fOmegaTimeHist = new
Histogram ("omega*t%2pi", "", fNumBins, 0.,
2.f*Math.PI);
fOmegaTimeHPan = new
HistPanel (fOmegaTimeHist);
omega_time_frame.getContentPane().add
(fOmegaTimeHPan);
omega_time_frame.setBounds(0,
height+100, width, height);
omega_time_frame.setVisible
(true);
}
} // setParameters
public void runSimulation () {
// Initialize the server.
// Server calculates sin (omega
* t) where omega is an input variable
// and t is the simulation time.
try {
System.err.println ("Client.runSimulation:
calling server.initialize");
boolean server_status
= fServer.initialize ("doesn't matter");
if (!server_status)
{
System.err.println
("Server initialization failed.");
System.exit
(1);
}
} // try
catch (RemoteException re) {
System.err.println ("Server
initialization failed:");
System.err.println (re);
System.exit (1);
}
// Initialize the simulation.
try {
System.err.println (
"Client.runSimulation:
calling server.initializeSimulation");
System.err.println ("Client.runSimulation:
initial params are amp = " +
fAmp + " omega
= " + fOmega + " K = " + fSpringCons + " dt = " +
fDeltaT + " tmax
= " + fMaxTime/(float)Math.PI + "pi (" +
fNumBins + "
bins)");
fIndata = new float[]
{
fAmp, fOmega,
fSpringCons, fDeltaT, fMaxTime, 0.f
};
fServer.initializeSimulation
(fIndata);
} // try
catch (RemoteException re) {
System.err.println ("Simulation
initialization failed:");
System.err.println (re);
System.exit (1);
}
// Set up variables to contain results
from simulation.
float[] outdata = new float[OUTSIZE];
float last_sim_time = -1.f;
float time, xposition, velocity,
acceleration, kinetic, potential;
float total_energy;
int total_hits = 0;
// Start the simulation running.
try {
System.err.println ("Client.runSimulation:
calling server.start");
System.err.println (
"Output will
be omega*t, xpos, vel, acc, KE, PE, total E");
fServer.start ();
} // try
catch (RemoteException re) {
System.err.println ("Simulation
failed to start:");
System.err.println (re);
System.exit (1);
}
// Retrieve data from the simulation.
try {
// Wait on first valid
value.
outdata[0] = -1.f;
while (outdata[0] <
0.f) {
outdata
= fServer.retrieveData (fIndata);
Thread.sleep
(80);
}
// Process real values.
while (outdata[0] >=
0.f) {
time
= outdata[0];
xposition =
outdata[1];
velocity
= outdata[2];
acceleration
= outdata[3];
kinetic
= outdata[4];
potential =
outdata[5];
total_energy
= kinetic + potential;
if (time
> last_sim_time) {
total_hits++;
last_sim_time
= time;
float
omtopi = fOmega * time / (float)Math.PI;
System.err.println
(
omtopi
+ " pi " + xposition + " " + velocity + " " +
acceleration
+ " " + kinetic + " " + potential + " " +
total_energy
);
fPositionHist.add
(xposition);
fPositionHPan.repaint
();
if
(DO_VELOCITY_HIST) {
fVelocityHist.add
(velocity);
fVelocityHPan.repaint
();
}
if
(DO_KE_HIST) {
fKEHist.add
(kinetic);
fKEPanel.repaint
();
}
if
(DO_PE_HIST) {
fPEHist.add
(potential);
fPEPanel.repaint
();
}
if
(DO_TIME_HIST) {
fTimeHist.add
(time);
fTimeHPan.repaint
();
}
if
(DO_OMEGA_TIME_HIST) {
fOmegaTimeHist.add
((fOmega*time)%(2.*Math.PI));
fOmegaTimeHPan.repaint
();
}
} // if
current sim time > previous sim time
else {
if
(time < 0.f)
System.err.println
("Negative time " + time +
" signals end of simulation from server");
else
System.err.println
(
"Client.runSimulation: ignoring repeated data time");
}
// Sleep
long enough for the server to have probably calculated
// the next
set of values.
Thread.sleep
(80);
// Get new
set of data from server.
outdata
= fServer.retrieveData (fIndata);
} // while simulation
is still running
} // try
catch (RemoteException re) {
System.err.println ("\nUGH,
server is no longer responding");
}
// InterruptedException intentionally
ignored.
catch (InterruptedException ie)
{
System.err.println (
"Client.runSimulation:
InterruptedException ignoered");
}
System.err.println ("Client.runSimulation:
while loop completed (" +
total_hits + " total unique
hits)");
int left_edge_bin = 0;
int central_bin = (fNumBins-1)/2;
int right_edge_bin = fNumBins-1;
int left_hits = fPositionHist.getValue
(left_edge_bin);
int central_hits = fPositionHist.getValue
(central_bin);
int right_hits = fPositionHist.getValue
(right_edge_bin);
float left_frac = (float) left_hits
/ total_hits;
float central_frac = (float) central_hits
/ total_hits;
float right_frac = (float) right_hits
/ total_hits;
System.err.println ("Client.runSimulation:
#hits at left edge bin (0) = " +
left_hits + " frac = " +
left_frac);
System.err.println ("Client.runSimulation:
#hits at central bin (" +
central_bin + ") = " + central_hits
+ " frac = " + central_frac);
System.err.println ("Client.runSimulation:
#hits at right edge bin (" +
right_edge_bin + ") = " +
right_hits + " frac = " + right_frac);
System.err.println ("\nClient.runSimulation:
params were " + fAmp + " " +
fOmega + " " + fSpringCons
+ " " + fDeltaT + " " +
fMaxTime/(float)Math.PI
+ "(*pi) " + fNumBins);
fReallyQuit = true;
} // runSimulation
public static void main (String[] args) {
System.err.println ("main: Instantiating
a new Client");
Client cl = new Client ();
System.err.println ("main: Calling
Client.setParameters()");
cl.setParameters (args);
System.err.println ("main: Calling
Client.runSimulation()");
cl.runSimulation ();
System.err.println ("main: back
from runSimulation(), main is terminating");
System.err.println (
"main: to run again, optional params are amp,
omega, K, dt, tmax, num bins");
} // main
} // Client
|