1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
from OpenGL.GL import *
from OpenGL.GLUT import *
import numpy as np
from boltzgas import HardSphereSetup, HardSphereSimulation
from boltzgas.initial_condition import grid_of_random_velocity_particles
from boltzgas.visual import View, VelocityHistogram, Tracer, ColoredBox
grid_width = 40
radius = 0.002
char_u = 1120
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()
for instrument in self.instruments:
try:
instrument.shutdown()
except AttributeError:
return # Doesn't matter, shutdown is optional
def make_display_handler(controller, view):
def on_display():
controller.evolve()
view.display()
return on_display
def make_reshape_handler(view):
def on_reshape(width, height):
view.reshape(width, height)
return on_reshape
def make_timer():
def on_timer(t):
glutTimerFunc(t, on_timer, t)
glutPostRedisplay()
return on_timer
def make_keyboard_handler(controller):
def on_keyboard(key, x, y):
if controller.isRunning():
controller.pause()
else:
controller.run()
return on_keyboard
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()
|