| | 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) |
| |
|