Skip to content

Commit 743990b

Browse files
committed
proper unit conversion (see javadoc for the K constant), xyz(t) plotting
1 parent 2cf7fc1 commit 743990b

File tree

1 file changed

+99
-21
lines changed

1 file changed

+99
-21
lines changed

src/asg/ion/TrajectorySolver.java

Lines changed: 99 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88
import info.monitorenter.gui.chart.ZoomableChart;
99
import info.monitorenter.gui.chart.traces.Trace2DLtd;
1010
import info.monitorenter.gui.chart.views.ChartPanel;
11+
import java.awt.Dimension;
12+
import java.io.BufferedOutputStream;
1113
import java.io.File;
1214
import java.io.FileNotFoundException;
15+
import java.io.FileOutputStream;
1316
import java.io.IOException;
1417
import java.io.PrintStream;
1518
import java.util.Scanner;
@@ -68,17 +71,15 @@ public void loadField(
6871
}
6972
}
7073

71-
private static double h = 1.0e-3;
72-
7374
// ix < dimX - 1, etc.
7475
private double dx(int ix, int iy, int iz) {
75-
return (potential[ix + 1][iy][iz] - potential[ix][iy][iz]) / h;
76+
return (potential[ix + 1][iy][iz] - potential[ix][iy][iz]);
7677
}
7778
private double dy(int ix, int iy, int iz) {
78-
return (potential[ix][iy + 1][iz] - potential[ix][iy][iz]) / h;
79+
return (potential[ix][iy + 1][iz] - potential[ix][iy][iz]);
7980
}
8081
private double dz(int ix, int iy, int iz) {
81-
return (potential[ix][iy][iz + 1] - potential[ix][iy][iz]) / h;
82+
return (potential[ix][iy][iz + 1] - potential[ix][iy][iz]);
8283
}
8384

8485
@Command
@@ -163,10 +164,38 @@ private static final double interpolate(double[][][] v, double x, double y, doub
163164
}
164165

165166
@Command
166-
public double getPotential(double x, double y, double z) {
167+
public final double getPotential(double x, double y, double z) {
167168
return interpolate(potential, x, y, z);
168169
}
169170

171+
private final double getEnergy(double e, double m,
172+
double x, double y, double z,
173+
double vx, double vy, double vz) {
174+
return -e * getPotential(x, y, z) + m * (vx*vx + vy*vy + vz*vz) / (2 * K);
175+
}
176+
177+
/**
178+
* On the unit system
179+
*
180+
* The user specifies quantities in following units:
181+
* e |e| units
182+
* E eV
183+
* m amu
184+
* V V
185+
* x arb.u.
186+
* t arb.u.
187+
* Where arbitrary units for x and t are in agreement:
188+
* if x is in mm, then t in ms, x in um, then t in us, etc.
189+
*
190+
* The Newton's equation is
191+
* e/m dV/dx = d2x/dt2, quantities in SI.
192+
* Transforming the eq. to our unit system:
193+
* K e/m dV/dx = d2x/dt2, where K = |elemCharge|/1amu = |elemCharge|*NAvogadro*1000/1kg
194+
* The same K appears in v(E): v = sqrt(2E/m) SI => v = sqrt(2E/m K),
195+
* Ekinetic = mv2/2K for the same reason.
196+
*/
197+
private static final double K = 9.648534147e6;
198+
170199
public void solve(double dt, double m, double e,
171200
double x0, double y0, double z0,
172201
double kineticE, double dirX, double dirY, double dirZ,
@@ -179,7 +208,7 @@ public void solve(double dt, double m, double e,
179208

180209
Vector dir = new Vector(dirX, dirY, dirZ);
181210
dir.normalizeIt();
182-
Vector v0 = dir.multiply(Math.sqrt(kineticE * 2 / m));
211+
Vector v0 = dir.multiply(Math.sqrt(kineticE * 2 / m * K));
183212

184213
int steps = 0;
185214
double t = 0;
@@ -191,15 +220,17 @@ public void solve(double dt, double m, double e,
191220
x >= 0 && x <= dimX &&
192221
y >= 0 && y <= dimY &&
193222
z >= 0 && z <= dimZ) {
223+
steps++;
224+
194225
es = getIntensity(x, y, z);
195226
if (es == null) {
196227
break;
197228
}
198229
t+= dt;
199230

200-
vx += dt * es[X] * e / m;
201-
vy += dt * es[Y] * e / m;
202-
vz += dt * es[Z] * e / m;
231+
vx += dt * es[X] * e / m * K;
232+
vy += dt * es[Y] * e / m * K;
233+
vz += dt * es[Z] * e / m * K;
203234

204235
x += dt * vx;
205236
y += dt * vy;
@@ -209,6 +240,9 @@ public void solve(double dt, double m, double e,
209240
c.point(t, x, y, z, vx, vy, vz);
210241
}
211242
}
243+
for (Callback c : callbacks) {
244+
c.close();
245+
}
212246
}
213247

214248
private JFrame chartFrame = null;
@@ -217,33 +251,70 @@ public void solve(double dt, double m, double e,
217251
public void showGraph() {
218252
if (chartFrame == null) {
219253
JFrame frame = new JFrame("Graph");
254+
frame.setSize(new Dimension(600, 400));
220255
ZoomableChart chart = new ZoomableChart();
221256
chart.addTrace(energyTrace);
222-
frame.getRootPane().add(new ChartPanel(chart));
257+
chart.addTrace(xCoordTrace);
258+
chart.addTrace(yCoordTrace);
259+
chart.addTrace(zCoordTrace);
260+
frame.getContentPane().add(new ChartPanel(chart));
223261
chartFrame = frame;
224262
}
225263
chartFrame.setVisible(true);
226264
}
227265

228-
private ITrace2D energyTrace = new Trace2DLtd(10000, "energy");
229-
private Callback energyPlottingCallback = new EnergyPllottingCallback();
266+
private static final int TRACE_SIZE_LIMIT = 10000;
267+
268+
private ITrace2D energyTrace = new Trace2DLtd(TRACE_SIZE_LIMIT, "energy");
269+
private Callback energyPlottingCallback = new EnergyPlottingCallback();
230270

231-
private class EnergyPllottingCallback implements Callback {
271+
private ITrace2D xCoordTrace = new Trace2DLtd(TRACE_SIZE_LIMIT, "x");
272+
private ITrace2D yCoordTrace = new Trace2DLtd(TRACE_SIZE_LIMIT, "y");
273+
private ITrace2D zCoordTrace = new Trace2DLtd(TRACE_SIZE_LIMIT, "z");
274+
private Callback coordPlottingCallback = new XYZPlottingCallback();
232275

233-
private double m;
234-
private double e;
276+
private abstract class PlottingCallback implements Callback {
277+
278+
protected double m;
279+
protected double e;
280+
281+
protected abstract void clearTraces();
235282

236283
public void params(double dt, double m, double e, double x0, double y0, double z0, double kineticE, double dirX, double dirY, double dirZ) {
284+
clearTraces();
237285
this.m = m;
238286
this.e = e;
239287
}
240288

289+
public abstract void point(double t, double x, double y, double z, double vx, double vy, double vz);
290+
291+
public void close() {}
292+
}
293+
294+
private class EnergyPlottingCallback extends PlottingCallback {
295+
296+
protected void clearTraces() {
297+
energyTrace.removeAllPoints();
298+
}
299+
241300
public void point(double t, double x, double y, double z, double vx, double vy, double vz) {
242-
final double fullE = e * getPotential(x, y, z) + (vx*vx + vy*vy + vz*vz) * m / 2;
243-
energyTrace.addPoint(t, fullE);
301+
energyTrace.addPoint(t, getEnergy(e, m, x, y, z, vx, vy, vz));
302+
}
303+
}
304+
305+
private class XYZPlottingCallback extends PlottingCallback {
306+
307+
protected void clearTraces() {
308+
xCoordTrace.removeAllPoints();
309+
yCoordTrace.removeAllPoints();
310+
zCoordTrace.removeAllPoints();
244311
}
245312

246-
public void close() {}
313+
public void point(double t, double x, double y, double z, double vx, double vy, double vz) {
314+
xCoordTrace.addPoint(t, x);
315+
yCoordTrace.addPoint(t, y);
316+
zCoordTrace.addPoint(t, z);
317+
}
247318
}
248319

249320
private class OutputCallback implements Callback {
@@ -316,14 +387,21 @@ public void setR0(double x, double y, double z) {
316387

317388
@Command
318389
public void fly(String outFileBase) throws FileNotFoundException {
319-
final Callback writer = new OutputCallback(new PrintStream(outFileBase + ".txt"));
390+
final Callback writer = new OutputCallback(new PrintStream(
391+
new BufferedOutputStream(new FileOutputStream(outFileBase + ".txt"))));
320392
solve(dt, mass, charge,
321393
r0.getX(), r0.getY(), r0.getZ(),
322394
k0, dirV0.getX(), dirV0.getY(), dirV0.getZ(),
323395
maxSteps,
324-
energyPlottingCallback, writer);
396+
energyPlottingCallback,
397+
// coordPlottingCallback,
398+
writer);
325399
}
326400

401+
@Command
402+
public void exit() {
403+
System.exit(0);
404+
}
327405

328406
/**
329407
* @param args the command line arguments

0 commit comments

Comments
 (0)