From c2ad326a7724cab7635c370e058f611156ab4e45 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Mon, 3 Dec 2018 13:40:35 +0300 Subject: [PATCH] Performance optimization --- .hgignore | 2 + .../inr/numass/trapping/SimulationManager.kt | 64 ++++++++++++------- .../kotlin/inr/numass/trapping/Trapping.kt | 32 ++++++---- 3 files changed, 61 insertions(+), 37 deletions(-) diff --git a/.hgignore b/.hgignore index 351c13c..11de5ab 100644 --- a/.hgignore +++ b/.hgignore @@ -4,6 +4,8 @@ \.rej$ \.conflict\~$ .gradle/ +output/ +notebooks/.ipynb_checkpoints .ipynb_checkpoints build/ .idea/* diff --git a/src/main/kotlin/inr/numass/trapping/SimulationManager.kt b/src/main/kotlin/inr/numass/trapping/SimulationManager.kt index 6b937aa..8dd2904 100644 --- a/src/main/kotlin/inr/numass/trapping/SimulationManager.kt +++ b/src/main/kotlin/inr/numass/trapping/SimulationManager.kt @@ -1,30 +1,25 @@ package inr.numass.trapping -import org.apache.commons.math3.analysis.UnivariateFunction import org.apache.commons.math3.analysis.interpolation.LinearInterpolator -import org.apache.commons.math3.random.JDKRandomGenerator -import org.apache.commons.math3.random.RandomGenerator import org.apache.commons.rng.UniformRandomProvider import org.apache.commons.rng.simple.RandomSource - -import java.io.* +import java.io.File +import java.io.PrintStream +import java.nio.file.Files +import java.nio.file.StandardOpenOption import java.util.stream.Stream /** * Created by darksnake on 04-Jun-16. */ -class SimulationManager { +class SimulationManager() { + + var outputDirectory: File = File("./output") + var fileName = "trap[test]" + + var comment = "" var generator: UniformRandomProvider = RandomSource.create(RandomSource.SPLIT_MIX_64) - - /** - * output for accepted events - */ - var output: PrintStream = System.out - /** - * output for statistics - */ - var statisticOutput = System.out var reportFilter: (Simulator.SimulationResult) -> Boolean = { it.state == Simulator.EndState.ACCEPTED } var initialE = 18000.0 @@ -51,14 +46,14 @@ class SimulationManager { return Math.acos(1 - 2 * x) } - fun setOutputFile(fileName: String) { - val outputFile = File(fileName) - if (!outputFile.exists()) { - outputFile.parentFile.mkdirs() - outputFile.createNewFile() - } - this.output = PrintStream(FileOutputStream(outputFile)) - } +// fun setOutputFile(fileName: String) { +// val outputFile = File(fileName) +// if (!outputFile.exists()) { +// outputFile.parentFile.mkdirs() +// outputFile.createNewFile() +// } +// this.output = PrintStream(FileOutputStream(outputFile)) +// } fun withReportFilter(filter: (Simulator.SimulationResult) -> Boolean): SimulationManager { @@ -91,10 +86,27 @@ class SimulationManager { */ @Synchronized fun simulateAll(num: Number): Counter { + if (!outputDirectory.exists()) { + outputDirectory.mkdirs() + } + val outputPath = outputDirectory.toPath().resolve("$fileName.out") + val output = PrintStream(Files.newOutputStream(outputPath, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE)) + val counter = Counter() val simulator = Simulator(eLow, thetaTransport, thetaPinch, gasDensity, bSource, magneticField, RandomGeneratorBridge(generator)) - System.out.printf("%nStarting sumulation with initial energy %g and %d electrons.%n%n", initialE, num.toLong()) + val header = """ + E_init = $initialE; + E_low = $eLow; + theta_pinch = $thetaPinch; + theta_transport = $thetaTransport; + density = $gasDensity; + """.trimIndent() + comment + + 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()) output.printf("%s\t%s\t%s\t%s\t%s\t%s%n", "E", "theta", "theta_start", "colNum", "L", "state") Stream.generate { getRandomTheta() }.limit(num.toLong()).parallel() .forEach { theta -> @@ -105,6 +117,10 @@ class SimulationManager { } counter.count(res) } + + val statisticsPath = outputDirectory.toPath().resolve("$fileName.stat") + val statisticOutput = PrintStream(Files.newOutputStream(statisticsPath, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE)) + statisticOutput.println(header + "\n") printStatistics(statisticOutput, simulator, counter) return counter } diff --git a/src/main/kotlin/inr/numass/trapping/Trapping.kt b/src/main/kotlin/inr/numass/trapping/Trapping.kt index b718209..3bca163 100644 --- a/src/main/kotlin/inr/numass/trapping/Trapping.kt +++ b/src/main/kotlin/inr/numass/trapping/Trapping.kt @@ -1,6 +1,7 @@ package inr.numass.trapping import org.apache.commons.rng.simple.RandomSource +import java.io.File import java.time.Duration import java.time.Instant @@ -10,20 +11,25 @@ fun main(args: Array) { //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 { - generator = RandomSource.create(RandomSource.SPLIT_MIX_64) - setOutputFile("D:\\Work\\Numass\\trapping\\test1.out") - setFields(0.6, 3.7, 7.2) - gasDensity = 1e19 - initialE = 14000.0 - range = 4000.0 - }.simulateAll(1e6) + val es = listOf(12000.0, 14000.0,16000.0,18000.0) - 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()) + for(e in es) { + val startTime = Instant.now() + + System.out.printf("Starting at %s%n%n", startTime.toString()) + SimulationManager().apply { + fileName = "trap[regular]" + generator = RandomSource.create(RandomSource.SPLIT_MIX_64) + setFields(0.6, 3.7, 7.2) + gasDensity = 1e19 + initialE = e + range = 4000.0 + }.simulateAll(1e6) + + 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()) + } }