aboutsummaryrefslogtreecommitdiff
path: root/gas.py
diff options
context:
space:
mode:
Diffstat (limited to 'gas.py')
-rw-r--r--gas.py123
1 files changed, 83 insertions, 40 deletions
diff --git a/gas.py b/gas.py
index 9261d87..6d4f927 100644
--- a/gas.py
+++ b/gas.py
@@ -7,59 +7,102 @@ from boltzgas import HardSphereSetup, HardSphereSimulation
from boltzgas.initial_condition import grid_of_random_velocity_particles
from boltzgas.visual import View, VelocityHistogram, Tracer, ColoredBox
-glutInit()
-glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
-glutInitWindowPosition(0, 0)
-glutCreateWindow("BoltzGas")
-
-grid_width = 32
-radius = 0.004
+grid_width = 40
+radius = 0.002
char_u = 1120
-position, velocity = grid_of_random_velocity_particles(grid_width, radius, char_u)
-velocity[:,:] = 0
-velocity[0,0] = 10*char_u
-velocity[0,1] = 4*char_u
+class SimulationController:
+ def __init__(self, gas, instruments):
+ self.running = False
+ self.gas = gas
+ self.instruments = instruments
+
+ def isRunning(self):
+ return self.running
+
+ def run(self):
+ self.running = True
+
+ def pause(self):
+ self.running = False
+
+ def evolve(self):
+ if self.running:
+ for i in range(0,5):
+ self.gas.evolve()
+
+ for instrument in self.instruments:
+ instrument.update()
+
+ def shutdown(self):
+ self.pause()
-config = HardSphereSetup(radius, char_u, position, velocity)
-gas = HardSphereSimulation(config, opengl = True, t_scale = 0.1)
+ for instrument in self.instruments:
+ try:
+ instrument.shutdown()
+ except AttributeError:
+ return # Doesn't matter, shutdown is optional
-tracer = Tracer(gas, 4)
-histogram = VelocityHistogram(gas, [1.1,0], [1,1])
-histogram.setup()
-view = View(gas, [ ColoredBox([0,0], [1,1], (0.2,0.2,0.2)), tracer ], [ histogram ])
-active = False
+def make_display_handler(controller, view):
+ def on_display():
+ controller.evolve()
+ view.display()
-def on_display():
- if active:
- for i in range(0,5):
- gas.evolve()
+ return on_display
- tracer.update()
- histogram.update()
+def make_reshape_handler(view):
+ def on_reshape(width, height):
+ view.reshape(width, height)
- view.display()
+ return on_reshape
-def on_reshape(width, height):
- view.reshape(width, height)
+def make_timer():
+ def on_timer(t):
+ glutTimerFunc(t, on_timer, t)
+ glutPostRedisplay()
-def on_timer(t):
- glutTimerFunc(t, on_timer, t)
- glutPostRedisplay()
+ return on_timer
-def on_keyboard(key, x, y):
- global active
- active = not active
+def make_keyboard_handler(controller):
+ def on_keyboard(key, x, y):
+ if controller.isRunning():
+ controller.pause()
+ else:
+ controller.run()
-def on_close():
- histogram.pool.shutdown()
+ return on_keyboard
-glutDisplayFunc(on_display)
-glutReshapeFunc(on_reshape)
-glutTimerFunc(10, on_timer, 10)
-glutKeyboardFunc(on_keyboard)
-glutCloseFunc(on_close)
+def make_close_handler(controller):
+ def on_close():
+ controller.shutdown()
+
+ return on_close
if __name__ == "__main__":
+ glutInit()
+ glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
+ glutInitWindowPosition(0, 0)
+ glutCreateWindow("BoltzGas")
+
+ position, velocity = grid_of_random_velocity_particles(grid_width, radius, char_u)
+ velocity[:,:] = 0
+ velocity[0,0] = 10*char_u
+ velocity[0,1] = 4*char_u
+
+ config = HardSphereSetup(radius, char_u, position, velocity)
+ gas = HardSphereSimulation(config, opengl = True, t_scale = 0.5)
+
+ tracer = Tracer(gas, 4)
+ histogram = VelocityHistogram(gas, [1.1,0], [1,1])
+ view = View(gas, [ ColoredBox([0,0], [1,1], (0.2,0.2,0.2)) ], [ histogram ])
+
+ controller = SimulationController(gas, [ histogram ])
+
+ glutDisplayFunc(make_display_handler(controller, view))
+ glutReshapeFunc(make_reshape_handler(view))
+ glutTimerFunc(20, make_timer(), 20)
+ glutKeyboardFunc(make_keyboard_handler(controller))
+ glutCloseFunc(make_close_handler(controller))
+
glutMainLoop()