|
|
import numpy as np |
|
|
import numba |
|
|
from numba import cuda |
|
|
import dask |
|
|
from dask import delayed |
|
|
from dask.diagnostics import ProgressBar |
|
|
import time |
|
|
from scipy.stats import norm |
|
|
|
|
|
|
|
|
c = 299792458 |
|
|
E_mc2 = c**2 |
|
|
TSR = E_mc2 / (1.38e-23) |
|
|
alpha = 1.0 |
|
|
Q = 2 ** (1 / 12) |
|
|
dark_energy_density = 5.96e-27 |
|
|
dark_matter_density = 2.25e-27 |
|
|
collision_distance = 1e-10 |
|
|
Hubble_constant = 70.0 |
|
|
Hubble_constant_SI = ( |
|
|
Hubble_constant * 1000 / 3.086e22 |
|
|
) |
|
|
|
|
|
|
|
|
temperature_initial = 1.42e32 |
|
|
particle_density_initial = 5.16e96 |
|
|
particle_speed_initial = c |
|
|
|
|
|
|
|
|
t_planck = 5.39e-44 |
|
|
t_simulation = t_planck * 1e3 |
|
|
|
|
|
|
|
|
quark_masses = { |
|
|
"up": 2.3e-3, |
|
|
"down": 4.8e-3, |
|
|
"charm": 1.28, |
|
|
"strange": 0.095, |
|
|
"top": 173.0, |
|
|
"bottom": 4.18, |
|
|
} |
|
|
|
|
|
|
|
|
while True: |
|
|
try: |
|
|
num_particles = int(input("Enter the number of particles (integer): ")) |
|
|
if num_particles <= 0: |
|
|
print("Please enter a positive integer.") |
|
|
else: |
|
|
break |
|
|
except ValueError: |
|
|
print("Invalid input. Please enter an integer.") |
|
|
|
|
|
|
|
|
while True: |
|
|
try: |
|
|
tunneling_probability = float(input("Enter the tunneling probability (float, 0-1): ")) |
|
|
if 0 <= tunneling_probability <= 1: |
|
|
break |
|
|
else: |
|
|
print("Please enter a value between 0 and 1.") |
|
|
except ValueError: |
|
|
print("Invalid input. Please enter a float.") |
|
|
|
|
|
|
|
|
additional_particles = { |
|
|
f"new_quark_{i}": np.random.uniform(1e-3, 1e-1) for i in range(num_particles - len(quark_masses)) |
|
|
} |
|
|
|
|
|
all_particles = {**quark_masses, **additional_particles} |
|
|
|
|
|
|
|
|
GeV_to_J = 1.60217662e-10 |
|
|
|
|
|
|
|
|
num_steps = int(t_simulation / t_planck) |
|
|
|
|
|
|
|
|
@cuda.jit |
|
|
def simulation_step(particle_speeds, particle_temperatures, particle_masses, step, tunneling_probability): |
|
|
tx = cuda.threadIdx.x |
|
|
bx = cuda.blockIdx.x |
|
|
bw = cuda.blockDim.x |
|
|
i = tx + bx * bw |
|
|
|
|
|
if i < num_particles: |
|
|
|
|
|
particle_speeds[i] = update_speed( |
|
|
particle_speeds[i], particle_temperatures[i], particle_masses[i] |
|
|
) |
|
|
|
|
|
|
|
|
if np.random.rand() < tunneling_probability: |
|
|
particle_speeds[i] = particle_speed_initial |
|
|
|
|
|
|
|
|
particle_temperatures[i] = alpha * particle_speeds[i] ** 2 |
|
|
|
|
|
|
|
|
for j in range(num_particles): |
|
|
if i != j: |
|
|
|
|
|
pass |
|
|
|
|
|
|
|
|
def update_speed(current_speed, current_temperature, particle_mass): |
|
|
rel_momentum = relativistic_momentum(current_speed, particle_mass) |
|
|
return c * np.sqrt( |
|
|
max(1e-10, 1 - (rel_momentum / (rel_momentum + dark_energy_density)) ** 2) |
|
|
) |
|
|
|
|
|
|
|
|
def relativistic_momentum(particle_speed, particle_mass): |
|
|
if particle_speed >= c: |
|
|
return np.inf |
|
|
return ( |
|
|
particle_mass |
|
|
* particle_speed |
|
|
/ np.sqrt(max(1e-10, 1 - (particle_speed / c) ** 2)) |
|
|
) |
|
|
|
|
|
|
|
|
additional_particles = { |
|
|
f"new_quark_{i}": np.random.uniform(1e-3, 1e-1) for i in range(num_particles - len(quark_masses)) |
|
|
} |
|
|
|
|
|
|
|
|
if num_particles < len(quark_masses): |
|
|
print(f"Warning: Reducing the number of particles to {len(quark_masses)} to match quark masses.") |
|
|
num_particles = len(quark_masses) |
|
|
|
|
|
all_particles = {**quark_masses, **additional_particles} |
|
|
|
|
|
|
|
|
initial_speeds = np.full(num_particles, particle_speed_initial, dtype=np.float64) |
|
|
initial_temperatures = np.full(num_particles, temperature_initial, dtype=np.float64) |
|
|
|
|
|
|
|
|
initial_masses = np.zeros(num_particles, dtype=np.float64) |
|
|
|
|
|
|
|
|
for i, (key, mass) in enumerate(all_particles.items()): |
|
|
if i < num_particles: |
|
|
initial_masses[i] = mass |
|
|
|
|
|
|
|
|
def main_simulation(tunneling_probability): |
|
|
|
|
|
d_particle_speeds = cuda.device_array(num_particles, dtype=np.float64) |
|
|
d_particle_temperatures = cuda.device_array(num_particles, dtype=np.float64) |
|
|
d_particle_masses = cuda.device_array(num_particles, dtype=np.float64) |
|
|
|
|
|
|
|
|
d_particle_speeds.copy_to_device(initial_speeds) |
|
|
d_particle_temperatures.copy_to_device(initial_temperatures) |
|
|
d_particle_masses.copy_to_device(initial_masses) |
|
|
|
|
|
|
|
|
for step in range(num_steps): |
|
|
simulation_step[1, num_particles](d_particle_speeds, d_particle_temperatures, d_particle_masses, step, tunneling_probability) |
|
|
|
|
|
|
|
|
h_particle_speeds = d_particle_speeds.copy_to_host() |
|
|
h_particle_temperatures = d_particle_temperatures.copy_to_host() |
|
|
h_particle_masses = d_particle_masses.copy_to_host() |
|
|
|
|
|
return h_particle_speeds, h_particle_temperatures, h_particle_masses |
|
|
|
|
|
if __name__ == "__main__": |
|
|
start_time = time.time() |
|
|
with ProgressBar(): |
|
|
task = delayed(main_simulation)(tunneling_probability) |
|
|
result = task.compute() |
|
|
end_time = time.time() |
|
|
print(f"Simulation completed in {end_time - start_time} seconds") |
|
|
|
|
|
|
|
|
particle_speeds, particle_temperatures, particle_masses = result |
|
|
print("Final Particle Speeds:", particle_speeds) |
|
|
print("Final Particle Temperatures:", particle_temperatures) |
|
|
print("Final Particle Masses:", particle_masses) |
|
|
|