Note
Click here to download the full example code
Boundary clusters in a disk
A classical mean-field Vicsek model in a bounded disk domain.
First of all, some standard imports.
import os
import sys
import time
import torch
import numpy as np
from matplotlib import pyplot as plt
from sisyphe.display import display_kinetic_particles
use_cuda = torch.cuda.is_available()
dtype = torch.cuda.FloatTensor if use_cuda else torch.FloatTensor
Set the parameters and create an instance of the Vicsek model.
import sisyphe.models as models
N = 1000000
L = 10.
dt = .01
nu = 3
sigma = 1.
kappa = nu/sigma
R = .1
c = 1.
center = torch.tensor([L/2,L/2]).type(dtype).reshape((1,2))
radius = L/2
pos = L*torch.rand((N,2)).type(dtype)
out = ((pos-center)**2).sum(1) > radius**2
while out.sum()>0:
pos[out,:] = L*torch.rand((out.sum(),2)).type(dtype)
out = ((pos-center)**2).sum(1) > radius**2
vel = torch.randn(N,2).type(dtype)
vel = vel/torch.norm(vel,dim=1).reshape((N,1))
simu=models.Vicsek(pos=pos,vel=vel,
v=c,
sigma=sigma,nu=nu,
interaction_radius=R,
box_size=L,
boundary_conditions='spherical',
variant = {"name" : "max_kappa", "parameters" : {"kappa_max" : 10.}},
options = {},
numerical_scheme='projection',
dt=dt,
block_sparse_reduction=True)
Set the block sparse parameters to their optimal value.
fastest, nb_cells, average_simu_time, simulation_time = simu.best_blocksparse_parameters(40,100)
plt.plot(nb_cells,average_simu_time)
plt.show()
Out:
Progress:0.0%
Progress:1.67%
Progress:3.33%
Progress:5.0%
Progress:6.67%
Progress:8.33%
Progress:10.0%
Progress:11.67%
Progress:13.33%
Progress:15.0%
Progress:16.67%
Progress:18.33%
Progress:20.0%
Progress:21.67%
Progress:23.33%
Progress:25.0%
Progress:26.67%
Progress:28.33%
Progress:30.0%
Progress:31.67%
Progress:33.33%
Progress:35.0%
Progress:36.67%
Progress:38.33%
Progress:40.0%
Progress:41.67%
Progress:43.33%
Progress:45.0%
Progress:46.67%
Progress:48.33%
Progress:50.0%
Progress:51.67%
Progress:53.33%
Progress:55.0%
Progress:56.67%
Progress:58.33%
Progress:60.0%
Progress:61.67%
Progress:63.33%
Progress:65.0%
Progress:66.67%
Progress:68.33%
Progress:70.0%
Progress:71.67%
Progress:73.33%
Progress:75.0%
Progress:76.67%
Progress:78.33%
Progress:80.0%
Progress:81.67%
Progress:83.33%
Progress:85.0%
Progress:86.67%
Progress:88.33%
Progress:90.0%
Progress:91.67%
Progress:93.33%
Progress:95.0%
Progress:96.67%
Progress:98.33%
Run the simulation and plot the particles.
# sphinx_gallery_thumbnail_number = -1
frames = [0, 10, 40, 70, 100, 150, 200, 250, 300]
s = time.time()
it, op = display_kinetic_particles(simu, frames, N_dispmax=100000)
e = time.time()
Out:
Progress:0%
Progress:1%
Progress:2%
Progress:3%
Progress:4%
Progress:5%
Progress:6%
Progress:7%
Progress:8%
Progress:9%
Progress:10%
Progress:11%
Progress:12%
Progress:13%
Progress:14%
Progress:15%
Progress:16%
Progress:17%
Progress:18%
Progress:19%
Progress:20%
Progress:21%
Progress:22%
Progress:23%
Progress:24%
Progress:25%
Progress:26%
Progress:27%
Progress:28%
Progress:29%
Progress:30%
Progress:31%
Progress:32%
Progress:33%
Progress:34%
Progress:35%
Progress:36%
Progress:37%
Progress:38%
Progress:39%
Progress:40%
Progress:41%
Progress:42%
Progress:43%
Progress:44%
Progress:45%
Progress:46%
Progress:47%
Progress:48%
Progress:49%
Progress:50%
Progress:51%
Progress:52%
Progress:53%
Progress:54%
Progress:55%
Progress:56%
Progress:57%
Progress:58%
Progress:59%
Progress:60%
Progress:61%
Progress:62%
Progress:63%
Progress:64%
Progress:65%
Progress:66%
Progress:67%
Progress:68%
Progress:69%
Progress:70%
Progress:71%
Progress:72%
Progress:73%
Progress:74%
Progress:75%
Progress:76%
Progress:77%
Progress:78%
Progress:79%
Progress:80%
Progress:81%
Progress:82%
Progress:83%
Progress:84%
Progress:85%
Progress:86%
Progress:87%
Progress:88%
Progress:89%
Progress:90%
Progress:91%
Progress:92%
Progress:93%
Progress:94%
Progress:95%
Progress:96%
Progress:97%
Progress:98%
Progress:99%
Print the total simulation time and the average time per iteration.
print('Total time: '+str(e-s)+' seconds')
print('Average time per iteration: '+str((e-s)/simu.iteration)+' seconds')
Out:
Total time: 1702.3468585014343 seconds
Average time per iteration: 0.05674489528338114 seconds
Total running time of the script: ( 30 minutes 47.639 seconds)