Translate russian captions.

This commit is contained in:
Alexander Nozik 2020-11-07 20:54:53 +03:00
parent c4f251a148
commit 656f16af70
4 changed files with 79 additions and 32 deletions

View File

@ -26,7 +26,8 @@ class SimulationManager() {
/** /**
* A supplier for random generator. Each track has its own generator * A supplier for random generator. Each track has its own generator
*/ */
var generatorFactory: (Long) -> UniformRandomProvider = { RandomSource.create(RandomSource.MT_64, seedGenerator.nextInt()) } var generatorFactory: (Long) -> UniformRandomProvider =
{ RandomSource.create(RandomSource.MT_64, seedGenerator.nextInt()) }
var reportFilter: (Simulator.SimulationResult) -> Boolean = { it.state == Simulator.EndState.ACCEPTED } var reportFilter: (Simulator.SimulationResult) -> Boolean = { it.state == Simulator.EndState.ACCEPTED }
var initialE = 18000.0 var initialE = 18000.0
@ -107,26 +108,35 @@ class SimulationManager() {
val outputPath = outputDirectory.toPath().resolve("$fileName.out") val outputPath = outputDirectory.toPath().resolve("$fileName.out")
PrintStream(Files.newOutputStream(outputPath, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE)).use { output -> PrintStream(
Files.newOutputStream(
outputPath,
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE
)
).use { output ->
output.println("# " + header.replace("\n", "\n# "))//adding comment symbols output.println("# " + header.replace("\n", "\n# "))//adding comment symbols
System.out.printf("%nStarting simulation with initial energy %g and %d electrons.%n%n", initialE, num.toLong()) System.out.printf("%nStarting simulation with initial energy %g and %d electrons.%n%n",
initialE,
num.toLong())
output.printf("%s\t%s\t%s\t%s\t%s\t%s\t%s%n", "id", "E", "theta", "theta_start", "colNum", "L", "state") output.printf("%s\t%s\t%s\t%s\t%s\t%s\t%s%n", "id", "E", "theta", "theta_start", "colNum", "L", "state")
LongStream.rangeClosed(1, num.toLong()).parallel() LongStream.rangeClosed(1, num.toLong()).parallel().mapToObj { id ->
.mapToObj { id ->
val generator = RandomGeneratorBridge(generatorFactory(id)) val generator = RandomGeneratorBridge(generatorFactory(id))
val theta = Math.acos(1 - 2 * generator.nextDouble())// from 0 to Pi val theta = Math.acos(1 - 2 * generator.nextDouble())// from 0 to Pi
val z = (generator.nextDouble() - 0.5) * Simulator.SOURCE_LENGTH val z = (generator.nextDouble() - 0.5) * Simulator.SOURCE_LENGTH
simulator.simulate(id, generator, initialE, theta, z).also { counter.count(it) } simulator.simulate(id, generator, initialE, theta, z).also { counter.count(it) }
} }.filter(reportFilter).forEach { res ->
.filter(reportFilter)
.forEach { res ->
printOne(output, res) printOne(output, res)
} }
} }
val statisticsPath = outputDirectory.toPath().resolve("$fileName.stat") val statisticsPath = outputDirectory.toPath().resolve("$fileName.stat")
PrintStream(Files.newOutputStream(statisticsPath, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE)).use { PrintStream(Files.newOutputStream(statisticsPath,
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE)).use {
it.println(header + "\n") it.println(header + "\n")
printStatistics(it, simulator, counter) printStatistics(it, simulator, counter)
@ -155,7 +165,14 @@ class SimulationManager() {
} }
private fun printOne(out: PrintStream, res: Simulator.SimulationResult) { private fun printOne(out: PrintStream, res: Simulator.SimulationResult) {
out.printf("%d\t%g\t%g\t%g\t%d\t%g\t%s%n", res.id, res.E, res.theta * 180 / Math.PI, res.initTheta * 180 / Math.PI, res.collisionNumber, res.l, res.state.toString()) out.printf("%d\t%g\t%g\t%g\t%d\t%g\t%s%n",
res.id,
res.E,
res.theta * 180 / Math.PI,
res.initTheta * 180 / Math.PI,
res.collisionNumber,
res.l,
res.state.toString())
out.flush() out.flush()
} }

View File

@ -29,11 +29,10 @@ class Simulator(
) { ) {
enum class EndState { enum class EndState {
ACCEPTED, // escaped to the spectrometer
ACCEPTED, //трэппинговый электрон попал в аксептанс REJECTED, // escaped to the rear side
REJECTED, //трэппинговый электрон вылетел через заднюю пробку LOWENERGY, // energy below lower border
LOWENERGY, //потерял слишком много энергии PASS, // Electron never trapped
PASS, //электрон никогда не запирался и прошел напрямую, нужно для нормировки
NONE NONE
} }
@ -45,7 +44,7 @@ class Simulator(
* @return * @return
*/ */
private fun scatter(pos: State): State { private fun scatter(pos: State): State {
//Вычисляем сечения и нормируем их на полное сечение //Computing cross-sections and normalizing them
var sigmaIon = Scatter.sigmaion(pos.e) var sigmaIon = Scatter.sigmaion(pos.e)
var sigmaEl = Scatter.sigmael(pos.e) var sigmaEl = Scatter.sigmael(pos.e)
var sigmaExc = Scatter.sigmaexc(pos.e) var sigmaExc = Scatter.sigmaexc(pos.e)
@ -54,7 +53,7 @@ class Simulator(
sigmaEl /= sigmaTotal sigmaEl /= sigmaTotal
sigmaExc /= sigmaTotal sigmaExc /= sigmaTotal
//проверяем нормировку //Checking norming
assert(Precision.equals(sigmaEl + sigmaExc + sigmaIon, 1.0, 1e-2)) assert(Precision.equals(sigmaEl + sigmaExc + sigmaIon, 1.0, 1e-2))
val alpha = pos.generator.nextDouble() val alpha = pos.generator.nextDouble()
@ -65,9 +64,8 @@ class Simulator(
else -> Scatter.randomexc(pos.e, pos.generator) //excitation case else -> Scatter.randomexc(pos.e, pos.generator) //excitation case
} }
//Обновляем значени угла и энергии независимо ни от чего // updating energy and angle
pos.substractE(delta.first) pos.substractE(delta.first)
//Изменение угла
pos.addTheta(delta.second / 180 * Math.PI) pos.addTheta(delta.second / 180 * Math.PI)
return pos return pos
@ -391,11 +389,11 @@ class Simulator(
// change to real angles // change to real angles
val realTheta = realTheta() val realTheta = realTheta()
//Создаем начальный вектор в сферических координатах // Initial vector in spherical coordinates
val init = SphericalCoordinates(1.0, 0.0, realTheta + dTheta) val init = SphericalCoordinates(1.0, 0.0, realTheta + dTheta)
// Задаем вращение относительно оси, перпендикулярной исходному вектору // Rotating on an axis perpendicular to the initial vector
val rotate = SphericalCoordinates(1.0, 0.0, realTheta) val rotate = SphericalCoordinates(1.0, 0.0, realTheta)
// поворачиваем исходный вектор на dTheta // Rotation the initial vector
val rot = Rotation(rotate.cartesian, phi, null) val rot = Rotation(rotate.cartesian, phi, null)
val result = rot.applyTo(init.cartesian) val result = rot.applyTo(init.cartesian)

View File

@ -18,6 +18,9 @@ infix fun ClosedFloatingPointRange<Double>.step(step: Double): Sequence<Double>
} }
/**
* Extract cross-sections from the code
*/
fun main() { fun main() {
val energies = ((1.0..20.0) step 0.2).toList() // energy in keV val energies = ((1.0..20.0) step 0.2).toList() // energy in keV

View File

@ -0,0 +1,29 @@
package ru.inr.mass.trapping
import java.time.Duration
import java.time.Instant
fun main() {
//val z = doubleArrayOf(-1.736, -1.27, -0.754, -0.238, 0.278, 0.794, 1.31, 1.776)
//val b = doubleArrayOf(3.70754, 0.62786, 0.60474, 0.60325, 0.60333, 0.60503, 0.6285, 3.70478)
// System.out.println("Press any key to start...");
// System.in.read();
val startTime = Instant.now()
System.out.printf("Starting at %s%n%n", startTime.toString())
SimulationManager().apply {
comment = "Out of the box cross-sections"
fileName = "trap-full-range"
setFields(0.6, 3.6, 7.2)
gasDensity = 1e19 // m^-3
initialE = 18500.0
range = 16000.0
}.simulateAll(1_000_001)
val finishTime = Instant.now()
System.out.printf("%nFinished at %s%n", finishTime.toString())
System.out.printf("Calculation took %s%n", Duration.between(startTime, finishTime).toString())
}