minor fixes. Updated libraries
This commit is contained in:
parent
b768fe6186
commit
42ffb6c8c3
@ -4,7 +4,10 @@
|
||||
*/
|
||||
package hep.dataforge.trapping;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.io.PrintStream;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import org.apache.commons.math3.geometry.euclidean.threed.Rotation;
|
||||
import org.apache.commons.math3.geometry.euclidean.threed.SphericalCoordinates;
|
||||
import org.apache.commons.math3.geometry.euclidean.threed.Vector3D;
|
||||
@ -52,15 +55,14 @@ public class ElectronTrappingSimulator {
|
||||
|
||||
if (initTheta < this.thetaPinch) {
|
||||
if (generator.heads()) {
|
||||
return new SimulaionResult(EndState.PASS, initEnergy, initTheta, 0);
|
||||
return new SimulaionResult(EndState.PASS, initEnergy, initTheta, initTheta, 0);
|
||||
} else {
|
||||
return new SimulaionResult(EndState.REJECTED, initEnergy, initTheta, 0);
|
||||
return new SimulaionResult(EndState.REJECTED, initEnergy, initTheta, initTheta, 0);
|
||||
}
|
||||
} else if(initTheta<this.thetaTransport){
|
||||
return new SimulaionResult(EndState.REJECTED, initEnergy, initTheta, 0);
|
||||
} else if (initTheta < this.thetaTransport) {
|
||||
return new SimulaionResult(EndState.REJECTED, initEnergy, initTheta, initTheta, 0);
|
||||
}
|
||||
|
||||
|
||||
double E = initEnergy;
|
||||
double theta = initTheta;
|
||||
int colNum = 0;
|
||||
@ -73,7 +75,6 @@ public class ElectronTrappingSimulator {
|
||||
DoubleValue dE = new DoubleValue(0);
|
||||
DoubleValue dTheta = new DoubleValue(0);
|
||||
|
||||
|
||||
//Вычисляем сечения и нормируем их на полное сечение
|
||||
double sigmaIon = Scatter.sigmaion(E);
|
||||
double sigmaEl = Scatter.sigmael(E);
|
||||
@ -130,7 +131,11 @@ public class ElectronTrappingSimulator {
|
||||
state = EndState.LOWENERGY;
|
||||
}
|
||||
}
|
||||
return new SimulaionResult(state, E, theta, colNum);
|
||||
SimulaionResult res = new SimulaionResult(state, E, theta, initTheta, colNum);
|
||||
if (state == EndState.ACCEPTED) {
|
||||
printOne(System.out, res);
|
||||
}
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
@ -145,7 +150,7 @@ public class ElectronTrappingSimulator {
|
||||
//Генерируем случайный фи
|
||||
double phi = generator.next() * 2 * Math.PI;
|
||||
//Создаем начальный вектор в сферических координатах
|
||||
SphericalCoordinates init = new SphericalCoordinates(1, 0, theta+dTheta);
|
||||
SphericalCoordinates init = new SphericalCoordinates(1, 0, theta + dTheta);
|
||||
// Задаем вращение относительно оси, перпендикулярной исходному вектору
|
||||
SphericalCoordinates rotate = new SphericalCoordinates(1, 0, theta);
|
||||
// поворачиваем исходный вектор на dTheta
|
||||
@ -153,9 +158,8 @@ public class ElectronTrappingSimulator {
|
||||
|
||||
Vector3D result = rot.applyTo(init.getCartesian());
|
||||
|
||||
// assert Vector3D.angle(result, rotate.getCartesian()) == dTheta;
|
||||
// assert Vector3D.angle(result, rotate.getCartesian()) == dTheta;
|
||||
return Math.acos(result.getZ());
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -165,17 +169,16 @@ public class ElectronTrappingSimulator {
|
||||
* @param num
|
||||
* @return
|
||||
*/
|
||||
public ArrayList<SimulaionResult> simulateAll(double E, int num) {
|
||||
ArrayList<SimulaionResult> res = new ArrayList();
|
||||
double theta;
|
||||
|
||||
public List<SimulaionResult> simulateAll(double E, int num) {
|
||||
System.out.printf("%nStarting sumulation with initial energy %g and %d electrons.%n%n", E, num);
|
||||
for (int i = 0; i < num; i++) {
|
||||
// System.out.printf("Running electron number %d", i);
|
||||
theta = this.getRandomTheta();
|
||||
res.add(this.simulateOne(E, theta));
|
||||
}
|
||||
return res;
|
||||
|
||||
return Stream.generate(() -> getRandomTheta()).limit(num).parallel()
|
||||
.map(theta -> simulateOne(E, theta))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static void printOne(PrintStream out, SimulaionResult res) {
|
||||
out.printf("%g\t%g\t%g\t%d\t%s%n", res.E, res.theta * 180 / Math.PI, res.initTheta * 180 / Math.PI, res.collisionNumber, res.state.toString());
|
||||
}
|
||||
|
||||
private double normalizeTheta(double theta) {
|
||||
@ -201,14 +204,16 @@ public class ElectronTrappingSimulator {
|
||||
|
||||
public class SimulaionResult {
|
||||
|
||||
public SimulaionResult(EndState state, double E, double theta, int collisionNumber) {
|
||||
public SimulaionResult(EndState state, double E, double theta, double initTheta, int collisionNumber) {
|
||||
this.state = state;
|
||||
this.E = E;
|
||||
this.theta = theta;
|
||||
this.initTheta = initTheta;
|
||||
this.collisionNumber = collisionNumber;
|
||||
}
|
||||
public EndState state;
|
||||
public double E;
|
||||
public double initTheta;
|
||||
public double theta;
|
||||
public int collisionNumber;
|
||||
}
|
||||
|
@ -2,9 +2,8 @@ package hep.dataforge.trapping;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.io.PrintStream;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Hello world!
|
||||
@ -13,10 +12,10 @@ import java.util.Iterator;
|
||||
public class Trapping {
|
||||
|
||||
public static void main(String[] args) throws FileNotFoundException {
|
||||
PrintWriter out = null;
|
||||
PrintStream out = null;
|
||||
if ((args.length > 0) && (args[0] != null)) {
|
||||
File file = new File(args[0]);
|
||||
out = new PrintWriter(file);
|
||||
out = new PrintStream(file);
|
||||
} else {
|
||||
|
||||
}
|
||||
@ -33,18 +32,15 @@ public class Trapping {
|
||||
int rejected = 0;
|
||||
int lowE = 0;
|
||||
|
||||
ArrayList<ElectronTrappingSimulator.SimulaionResult> results = simulator.simulateAll(E, 50000);
|
||||
|
||||
for (Iterator<ElectronTrappingSimulator.SimulaionResult> it = results.iterator(); it.hasNext();) {
|
||||
ElectronTrappingSimulator.SimulaionResult res = it.next();
|
||||
List<ElectronTrappingSimulator.SimulaionResult> results = simulator.simulateAll(E, 500000);
|
||||
|
||||
for (ElectronTrappingSimulator.SimulaionResult res : results) {
|
||||
if (out != null) {
|
||||
out.printf("%g\t%g\t%d\t%s%n", res.E, res.theta * 180 / Math.PI, res.collisionNumber, res.state.toString());
|
||||
ElectronTrappingSimulator.printOne(System.out, res);
|
||||
}
|
||||
switch (res.state) {
|
||||
|
||||
case ACCEPTED:
|
||||
System.out.printf("%g\t%g\t%d\t%s%n", res.E, res.theta * 180 / Math.PI, res.collisionNumber, res.state.toString());
|
||||
// ElectronTrappingSimulator.printOne(System.out, res);
|
||||
accepted++;
|
||||
break;
|
||||
case LOWENERGY:
|
||||
|
@ -4,8 +4,9 @@
|
||||
*/
|
||||
package hep.dataforge.trapping;
|
||||
|
||||
import org.apache.commons.math3.random.JDKRandomGenerator;
|
||||
import org.apache.commons.math3.random.MersenneTwister;
|
||||
import org.apache.commons.math3.random.RandomGenerator;
|
||||
import org.apache.commons.math3.random.SynchronizedRandomGenerator;
|
||||
|
||||
/**
|
||||
*
|
||||
@ -15,7 +16,7 @@ public class TrappingRandomGenerator {
|
||||
RandomGenerator generator;
|
||||
|
||||
public TrappingRandomGenerator() {
|
||||
this.generator = new JDKRandomGenerator();
|
||||
this.generator = new SynchronizedRandomGenerator(new MersenneTwister());
|
||||
}
|
||||
|
||||
public TrappingRandomGenerator(RandomGenerator generator) {
|
||||
|
Loading…
Reference in New Issue
Block a user