Event disks box.py
From Werner KRAUTH
(Difference between revisions)
Revision as of 21:42, 22 September 2015 Werner (Talk | contribs) ← Previous diff |
Revision as of 22:07, 22 September 2015 Werner (Talk | contribs) Next diff → |
||
Line 1: | Line 1: | ||
- | This page presents the program markov_disks_box.py, a Markov-chain algorithm for four disks in a square box of sides 1. | + | This page presents the program event_disks_box.py, an event-driven molecular dynamics algorithm for four disks in a square box of sides 1 without periodic boundary conditions. |
__FORCETOC__ | __FORCETOC__ | ||
Line 6: | Line 6: | ||
=Program= | =Program= | ||
- | import random | ||
- | |||
- | L = [[0.25, 0.25], [0.75, 0.25], [0.25, 0.75], [0.75, 0.75]] | ||
- | sigma = 0.15 | ||
- | sigma_sq = sigma ** 2 | ||
- | delta = 0.1 | ||
- | n_steps = 1000 | ||
- | for steps in range(n_steps): | ||
- | a = random.choice(L) | ||
- | b = [a[0] + random.uniform(-delta, delta), a[1] + random.uniform(-delta, delta)] | ||
- | min_dist = min((b[0] - c[0]) ** 2 + (b[1] - c[1]) ** 2 for c in L if c != a) | ||
- | box_cond = min(b[0], b[1]) < sigma or max(b[0], b[1]) > 1.0 - sigma | ||
- | if not (box_cond or min_dist < 4.0 * sigma ** 2): | ||
- | a[:] = b | ||
- | print L | ||
- | |||
- | =Version= | ||
- | See history for version information. | ||
- | [[Category:Python]] | ||
Line 82: | Line 63: | ||
print 'pos', pos | print 'pos', pos | ||
print 'vel', vel | print 'vel', vel | ||
+ | |||
+ | =Version= | ||
+ | See history for version information. | ||
+ | |||
+ | [[Category:Python]] [[Category:Honnef_2015]] [[Category:MOOC_SMAC]] |
Revision as of 22:07, 22 September 2015
This page presents the program event_disks_box.py, an event-driven molecular dynamics algorithm for four disks in a square box of sides 1 without periodic boundary conditions.
Contents |
Description
Program
import math def wall_time(pos_a, vel_a, sigma): if vel_a > 0.0: del_t = (1.0 - sigma - pos_a) / vel_a elif vel_a < 0.0: del_t = (pos_a - sigma) / abs(vel_a) else: del_t = float('inf') return del_t def pair_time(pos_a, vel_a, pos_b, vel_b, sigma): del_x = [pos_b[0] - pos_a[0], pos_b[1] - pos_a[1]] del_x_sq = del_x[0] ** 2 + del_x[1] ** 2 del_v = [vel_b[0] - vel_a[0], vel_b[1] - vel_a[1]] del_v_sq = del_v[0] ** 2 + del_v[1] ** 2 scal = del_v[0] * del_x[0] + del_v[1] * del_x[1] Upsilon = scal ** 2 - del_v_sq * ( del_x_sq - 4.0 * sigma **2) if Upsilon > 0.0 and scal < 0.0: del_t = - (scal + math.sqrt(Upsilon)) / del_v_sq else: del_t = float('inf') return del_t pos = [[0.25, 0.25], [0.75, 0.25], [0.25, 0.75], [0.75, 0.75]] vel = [[0.21, 0.12], [0.71, 0.18], [-0.23, -0.79], [0.78, 0.1177]] singles = [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)] pairs = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)] sigma = 0.15 t = 0.0 n_events = 100 for event in range(n_events): wall_times = [wall_time(pos[k][l], vel[k][l], sigma) for k, l in singles] pair_times = [pair_time(pos[k], vel[k], pos[l], vel[l], sigma) for k, l in pairs] next_event = min(wall_times + pair_times) t += next_event for k, l in singles: pos[k][l] += vel[k][l] * next_event if min(wall_times) < min(pair_times): collision_disk, direction = singles[wall_times.index(next_event)] vel[collision_disk][direction] *= -1.0 else: a, b = pairs[pair_times.index(next_event)] del_x = [pos[b][0] - pos[a][0], pos[b][1] - pos[a][1]] abs_x = math.sqrt(del_x[0] ** 2 + del_x[1] ** 2) e_perp = [c / abs_x for c in del_x] del_v = [vel[b][0] - vel[a][0], vel[b][1] - vel[a][1]] scal = del_v[0] * e_perp[0] + del_v[1] * e_perp[1] for k in range(2): vel[a][k] += e_perp[k] * scal vel[b][k] -= e_perp[k] * scal print 'event', event print 'time', t print 'pos', pos print 'vel', vel
Version
See history for version information.