From 93d7c4be4203b9e60c387c0577a82d01bc9c3909 Mon Sep 17 00:00:00 2001 From: Lars Bogner Date: Wed, 15 Oct 2025 16:40:51 +0200 Subject: [PATCH] Further development on project 3 --- .gitignore | 3 +- projects/project3/chapters/methods.tex | 5 +- projects/project3/chapters/results.tex | 10 +- projects/project3/main.pdf | Bin 210192 -> 210227 bytes src/project3/generate_plots.sh | 55 ++++++++++ src/project3/generate_results.sh | 26 +++-- src/project3/include/solvers.hpp | 7 ++ src/project3/many_particles.cpp | 7 ++ src/project3/python/plot_energies.py | 56 ++++++++-- src/project3/python/plot_resonances.py | 55 ++++++++-- src/project3/python/plot_trajectories.py | 127 ++++++++++++++++------- src/project3/src/solvers.cpp | 20 ++++ src/project3/two_particles.cpp | 67 +++++------- 13 files changed, 328 insertions(+), 110 deletions(-) create mode 100755 src/project3/generate_plots.sh diff --git a/.gitignore b/.gitignore index ed13ab5..068d5c3 100644 --- a/.gitignore +++ b/.gitignore @@ -290,4 +290,5 @@ src/project3/results/*/*.dat src/project3/results/*/*/*.red *.tar.gz *_timing.txt -run_stats.json \ No newline at end of file +run_stats.json +src/project3/python/plots/ \ No newline at end of file diff --git a/projects/project3/chapters/methods.tex b/projects/project3/chapters/methods.tex index e47f9eb..8223735 100644 --- a/projects/project3/chapters/methods.tex +++ b/projects/project3/chapters/methods.tex @@ -91,11 +91,14 @@ The method is time-reversible and conserves energy better over long time periods \end{align} It is important to note that the Velocity-Verlet integrator requires forces to be independent of velocity. In the case, that the algorithm is applicable, it is a very efficient method, as it only requires a single force evaluation per time step, while still being a second order method with a local truncation error per step on the order of $\mathcal{O}(h^3)$ and a global error after $N$ steps on the order of $\mathcal{O}(h^2)$. +\subsubsection*{Boris algorithm} +\textcolor{red}{TODO} + \subsection*{Code Structure} The basic framework for the numerical analysis is based on a \texttt{PenningTrap} class, which contains all the particles present in the trap, as well as a parametrization of the electric and magnetic fields. The particles are represented by a \texttt{Particle} class, which contains the physical properties of the particle, as well as its current position and velocity. With this information, the \texttt{PenningTrap} class can calculate the forces acting on each particle, including the external fields and the particle-particle interactions. The particle-particle interactions can be toggled on and off, allowing for a simulation of both scenarios. The external fields can be modified by supplying a field-method of the form \texttt{external\_field(const arma::vec\& r, double t, const PenningTrap\& trap)}. The reference to the \texttt{PenningTrap} allows for the parameters of the field to be stored in the trap object. The implementation of the \texttt{Particle} and \texttt{PenningTrap} classes can be found in \texttt{/src/project3/include/classes.hpp} of the project repository, as well as in the corresponding source file \texttt{/src/project3/src/classes.cpp}. \subsection*{Numerical Methods Implementation} -All numerical methods are implemented as classes inheriting from a base class \texttt{Solver}. The base class contains a reference to the \texttt{PenningTrap} object, as well as the time step size. The recording of particle properties over time, like postion and velocity is part of the general \texttt{Solver} class. Each derived class implements the \texttt{step()} method, which updates the state of the system by one time step using the respective numerical method. The implementation of the \texttt{Solver} class and its derived classes can be found in \texttt{/src/project3/include/solvers.hpp} of the project repository, as well as in the corresponding source file \texttt{/src/project3/src/solvers.cpp}. The following solvers are implemented:\texttt{Forward\-Euler\-Solver}, \texttt{RK4\-Solver}, \texttt{Velocity\-Verlet\-Solver} and \texttt{Analytical\-Solver}, which implements the analytical solution for a special case of initial conditions (see \cref{app:special_case_analytical_solution}). +All numerical methods are implemented as classes inheriting from a base class \texttt{Solver}. The base class contains a reference to the \texttt{PenningTrap} object, as well as the time step size. The recording of particle properties over time, like position and velocity is part of the general \texttt{Solver} class. Each derived class implements the \texttt{step()} method, which updates the state of the system by one time step using the respective numerical method. The implementation of the \texttt{Solver} class and its derived classes can be found in \texttt{/src/project3/include/solvers.hpp} of the project repository, as well as in the corresponding source file \texttt{/src/project3/src/solvers.cpp}. The following solvers are implemented:\texttt{Forward\-Euler\-Solver}, \texttt{RK4\-Solver}, \texttt{Velocity\-Verlet\-Solver} and \texttt{Analytical\-Solver}, which implements the analytical solution for a special case of initial conditions (see \cref{app:special_case_analytical_solution}). \subsection*{Tools} \textcolor{red}{TODO} \ No newline at end of file diff --git a/projects/project3/chapters/results.tex b/projects/project3/chapters/results.tex index 7ea86a7..1c4a505 100644 --- a/projects/project3/chapters/results.tex +++ b/projects/project3/chapters/results.tex @@ -1,9 +1,7 @@ -\subsection{Numerical Accuracy of Trajectories} +\subsection*{Numerical Accuracy of Trajectories} -\subsection{Energy Conservation} +\subsection*{Performance and Efficiency} +\subsection*{Many-Body Simulations} -\subsection{Performance and Efficiency} - -\subsection{Many-Body Simulations} - +\subsection*{Symplectic Properties} \ No newline at end of file diff --git a/projects/project3/main.pdf b/projects/project3/main.pdf index f84eb7806681a712a05eba93ea3ab3a80d8f4039..3999fe92ce71a060bbd37271a0f35c44508cfe94 100644 GIT binary patch delta 46333 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%0DkcUDW~ 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

D-Jy>-Fnyzwrw_P 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 w_0; diff --git a/src/project3/many_particles.cpp b/src/project3/many_particles.cpp index 19efa67..0b2ce75 100644 --- a/src/project3/many_particles.cpp +++ b/src/project3/many_particles.cpp @@ -63,6 +63,9 @@ int main(int argc, char* argv[]) { program.add_argument("-V", "--velocity-verlet") .help("Use Velocity Verlet solver instead of RK4") .flag(); + program.add_argument("-B", "--boris") + .help("Use Boris solver instead of RK4") + .flag(); program.add_argument("-t", "--timing") .help("Enable timing of the simulation") .flag(); @@ -83,6 +86,7 @@ int main(int argc, char* argv[]) { bool oscillating_potential = program.get("--oscillating-potential"); bool use_euler = program.get("--euler"); bool use_velocity_verlet = program.get("--velocity-verlet"); + bool use_boris = program.get("--boris"); bool timing = program.get("--timing"); double B_0 = 1.0; // Tesla @@ -125,6 +129,9 @@ int main(int argc, char* argv[]) { } else if (use_velocity_verlet) { solver = make_unique(trap, dt); solver_name = "VelocityVerlet"; + } else if (use_boris) { + solver = make_unique(trap, dt); + solver_name = "Boris"; } else { solver = make_unique(trap, dt); solver_name = "RK4"; diff --git a/src/project3/python/plot_energies.py b/src/project3/python/plot_energies.py index 0b7b959..311a21e 100644 --- a/src/project3/python/plot_energies.py +++ b/src/project3/python/plot_energies.py @@ -2,8 +2,41 @@ import matplotlib.pyplot as plt import numpy as np import os import typer +from pathlib import Path +from typing import List app = typer.Typer() +SHOW_PLOTS = os.getenv("SHOW_PLOTS", "1") == "1" + + +def get_rc_params(): + colors = ["FF220C", "70D6FF", "8AAA79", "666370", "1C1F33"] + rcParams = plt.rcParams + # Use LaTeX for rendering + # Setup fonts + rcParams["text.usetex"] = True + rcParams["font.family"] = "serif" + rcParams["font.size"] = 12 + rcParams["axes.labelsize"] = 12 + rcParams["axes.titlesize"] = 12 + rcParams["legend.fontsize"] = 10 + rcParams["xtick.labelsize"] = 10 + rcParams["ytick.labelsize"] = 10 + # Figure size and resolution + rcParams["figure.figsize"] = (6, 4) + rcParams["figure.dpi"] = 300 + # Use colors from the palette + rcParams["axes.prop_cycle"] = plt.cycler(color=[f"#{color}" for color in colors]) + # Grid + rcParams["axes.grid"] = True + rcParams["grid.alpha"] = 0.5 + rcParams["grid.linestyle"] = "--" + # Point ticks to the inside of the axes + rcParams["xtick.direction"] = "in" + rcParams["ytick.direction"] = "in" + rcParams["xtick.top"] = True + rcParams["ytick.right"] = True + return rcParams def load_data(total_energy_file): total_energy = np.loadtxt(total_energy_file) @@ -15,20 +48,25 @@ def load_data(total_energy_file): return total_energy, kinetic_energy, potential_energy, step_count @app.command() -def plot_kinetic_energy(energy_files: list[str]=[], labels: list[str]=[], mass: float=1.0): +def plot_kinetic_energy(total_energy_files: List[Path], output_file: Path): """Plot kinetic energy from velocity files.""" + plt.rcParams.update(get_rc_params()) + fig, ax = plt.subplots() + energy_files = [str(fn) for fn in total_energy_files if fn.is_file()] + labels = [f"{fn.split('/')[-2]} ({fn.split('/')[-1].split('_')[4]})" for fn in energy_files] for i, energy_file in enumerate(energy_files): total_energy, kinetic_energy, potential_energy, step_count = load_data(energy_file) time = np.linspace(0, 50e-6, step_count) color = f"C{i % 10}" - plt.plot(time, total_energy, label=labels[i], color=color, linestyle="-") - plt.plot(time, potential_energy, color=color, linestyle="--") - plt.plot(time, kinetic_energy, color=color, linestyle=":") - plt.xlabel('Time (s)') - plt.ylabel('Energy (J)') - plt.title('Energy Evolution') - plt.legend() - plt.show() + ax.plot(time, total_energy, label=labels[i], color=color, linestyle="-") + ax.plot(time, potential_energy, color=color, linestyle="--") + ax.plot(time, kinetic_energy, color=color, linestyle=":") + ax.set_xlabel("Time (s)") + ax.set_ylabel(r"Energy (Da $\cdot$ m$^2$/s$^2$)") + ax.legend() + fig.savefig(output_file) + if SHOW_PLOTS: + fig.show() if __name__ == "__main__": diff --git a/src/project3/python/plot_resonances.py b/src/project3/python/plot_resonances.py index 359acbb..5e1d93f 100644 --- a/src/project3/python/plot_resonances.py +++ b/src/project3/python/plot_resonances.py @@ -2,12 +2,52 @@ import matplotlib.pyplot as plt import numpy as np import os import argparse +from pathlib import Path argparser = argparse.ArgumentParser() argparser.add_argument("directory", type=str, help="Directory containing the data files") args = argparser.parse_args() directory = args.directory +def get_rc_params(): + colors = ["FF220C", "70D6FF", "8AAA79", "666370", "1C1F33"] + rcParams = plt.rcParams + # Use LaTeX for rendering + # Setup fonts + rcParams["text.usetex"] = True + rcParams["font.family"] = "serif" + rcParams["font.size"] = 12 + rcParams["axes.labelsize"] = 12 + rcParams["axes.titlesize"] = 12 + rcParams["legend.fontsize"] = 10 + rcParams["xtick.labelsize"] = 10 + rcParams["ytick.labelsize"] = 10 + # Figure size and resolution + rcParams["figure.figsize"] = (6, 4) + rcParams["figure.dpi"] = 300 + # Use colors from the palette + rcParams["axes.prop_cycle"] = plt.cycler(color=[f"#{color}" for color in colors]) + # Grid + rcParams["axes.grid"] = True + rcParams["grid.alpha"] = 0.5 + rcParams["grid.linestyle"] = "--" + # Point ticks to the inside of the axes + rcParams["xtick.direction"] = "in" + rcParams["ytick.direction"] = "in" + rcParams["xtick.top"] = True + rcParams["ytick.right"] = True + return rcParams + +SHOW_PLOTS = os.getenv("SHOW_PLOTS", "1") == "1" + +def get_filename(path: Path, plottername: str) -> str: + general_path = Path(__file__).parent / "plots" + plotter_dir = general_path / plottername + plotter_dir.mkdir(parents=True, exist_ok=True) + filename = plotter_dir / Path(Path(path).parent.name + "_ " + Path(path).name.replace(".dat", f"_{plottername}.pdf")) + return str(filename) + + def get_filenames(directory): filenames = [os.path.join(directory, f) for f in os.listdir(directory) if f.endswith(".red")] return filenames @@ -23,18 +63,21 @@ def load_data(filename): return x def plot_resonances(amplitudes, omegas, counts): - plt.figure(figsize=(8, 6)) + plt.rcParams.update(get_rc_params()) + fig, ax = plt.subplots() unique_amps = sorted(set(amplitudes)) for amp in unique_amps: mask = np.array(amplitudes) == amp omegas_subset = np.array(omegas)[mask] counts_subset = np.array(counts)[mask] omegas_sorted, counts_sorted = zip(*sorted(zip(omegas_subset, counts_subset))) - plt.plot(omegas_sorted, counts_sorted, label=f'Amplitude {amp}') - plt.xlabel('Omega') - plt.ylabel('Count inside trap') - plt.legend() - plt.show() + ax.plot(omegas_sorted, counts_sorted, label=f'Amplitude {amp}') + ax.set_xlabel('Omega') + ax.set_ylabel('Count inside trap') + ax.legend() + fig.savefig(get_filename(Path(directory), "resonances")) + if SHOW_PLOTS: + fig.show() if __name__ == "__main__": filenames = get_filenames(directory) diff --git a/src/project3/python/plot_trajectories.py b/src/project3/python/plot_trajectories.py index 620924d..681db46 100644 --- a/src/project3/python/plot_trajectories.py +++ b/src/project3/python/plot_trajectories.py @@ -2,14 +2,53 @@ import matplotlib.pyplot as plt import numpy as np import os import typer -from typing import Literal +from typing import Literal, List +from pathlib import Path app = typer.Typer() -def load_trajectory_data(filename): +SHOW_PLOTS = os.getenv("SHOW_PLOTS", "1") == "1" + +def get_rc_params(): + colors = ["FF220C", "70D6FF", "8AAA79", "666370", "1C1F33"] + rcParams = plt.rcParams + # Use LaTeX for rendering + # Setup fonts + rcParams["text.usetex"] = True + rcParams["font.family"] = "serif" + rcParams["font.size"] = 12 + rcParams["axes.labelsize"] = 12 + rcParams["axes.titlesize"] = 12 + rcParams["legend.fontsize"] = 10 + rcParams["xtick.labelsize"] = 10 + rcParams["ytick.labelsize"] = 10 + # Figure size and resolution + rcParams["figure.figsize"] = (6, 4) + rcParams["figure.dpi"] = 300 + # Use colors from the palette + rcParams["axes.prop_cycle"] = plt.cycler(color=[f"#{color}" for color in colors]) + # Grid + rcParams["axes.grid"] = True + rcParams["grid.alpha"] = 0.5 + rcParams["grid.linestyle"] = "--" + # Point ticks to the inside of the axes + rcParams["xtick.direction"] = "in" + rcParams["ytick.direction"] = "in" + rcParams["xtick.top"] = True + rcParams["ytick.right"] = True + return rcParams + +def get_filename(path: Path, plottername: str) -> str: + general_path = Path(__file__).parent / "plots" + plotter_dir = general_path / plottername + plotter_dir.mkdir(parents=True, exist_ok=True) + filename = plotter_dir / Path(path).name.replace(".dat", f"_{plottername}.pdf") + return str(filename) + +def load_trajectory_data(filename: Path): data = np.loadtxt(filename) - step_count = int(float(filename.split("/")[-1].split("_")[5])) - particle_count = int(float(filename.split("/")[-1].split("_")[2])) + step_count = int(float(filename.name.split("_")[5])) + particle_count = int(float(filename.name.split("_")[2])) single_particle = particle_count == 1 if single_particle: data = data.reshape((data.shape[0], 1)) @@ -17,77 +56,93 @@ def load_trajectory_data(filename): return data, step_count, particle_count @app.command() -def plot_z_evolution(trajectory_file: str): +def plot_z_evolution(trajectory_file: Path): """Plot the z-coordinate evolution from a trajectory file.""" + plt.rcParams.update(get_rc_params()) + fig, ax = plt.subplots() data, step_count, particle_count = load_trajectory_data(trajectory_file) time = np.linspace(0, 50e-6, step_count) for i in range(particle_count): - plt.plot(time, data[2, i, :] * 1e-6, label=f'Particle {i+1}') - plt.xlabel('Time (s)') - plt.ylabel('Z Position (m)') - plt.title('Z Coordinate Evolution') - plt.legend() - plt.show() + ax.plot(time, data[2, i, :] * 1e-6, label=f'Particle {i+1}') + ax.set_xlabel('Time (s)') + ax.set_ylabel('Z Position (m)') + ax.set_title('Z Coordinate Evolution') + ax.legend() + fig.savefig(get_filename(trajectory_file, "z_evolution")) + if SHOW_PLOTS: + fig.show() @app.command() -def plot_xy_trajectory(trajectory_file: str, plot_start_end: bool = True, plot_time: bool = False): +def plot_xy_trajectory(trajectory_file: Path, plot_start_end: bool = True, plot_time: bool = False): """Plot the XY trajectory from a trajectory file.""" + plt.rcParams.update(get_rc_params()) + fig, ax = plt.subplots() data, step_count, particle_count = load_trajectory_data(trajectory_file) for i in range(particle_count): if plot_start_end: - plt.scatter(data[0, i, 0] * 1e-6, data[1, i, 0] * 1e-6, marker="o", color="black", label="Start" if i == 0 else "") - plt.scatter(data[0, i, -1] * 1e-6, data[1, i, -1] * 1e-6, marker="x", color="red", label="End" if i == 0 else "") + ax.scatter(data[0, i, 0] * 1e-6, data[1, i, 0] * 1e-6, marker="o", color="black", label="Start" if i == 0 else "") + ax.scatter(data[0, i, -1] * 1e-6, data[1, i, -1] * 1e-6, marker="x", color="red", label="End" if i == 0 else "") if plot_time: marker = [".", ",", "o", "v", "^", "<", ">", "1", "2", "3", "4", "8"][i % 12] cm = plt.get_cmap('viridis') c = cm(np.linspace(0, 1, step_count)) - plt.scatter(data[0, i, :] * 1e-6, data[1, i, :] * 1e-6, label=f'Particle {i+1}', marker=marker, c=c) + ax.scatter(data[0, i, :] * 1e-6, data[1, i, :] * 1e-6, label=f'Particle {i+1}', marker=marker, c=c) else: ls = "-" c = f"C{i % 10}" - plt.plot(data[0, i, :] * 1e-6, data[1, i, :] * 1e-6, label=f'Particle {i+1}', linestyle=ls, color=c) - plt.xlabel('X Position (m)') - plt.ylabel('Y Position (m)') - plt.title('XY Trajectory') - plt.axis('equal') + ax.plot(data[0, i, :] * 1e-6, data[1, i, :] * 1e-6, label=f'Particle {i+1}', linestyle=ls, color=c) + ax.set_xlabel('X Position (m)') + ax.set_ylabel('Y Position (m)') + ax.set_title('XY Trajectory') + ax.axis('equal') if plot_time: #sm = plt.cm.ScalarMappable(cmap=cm, norm=plt.Normalize(vmin=0, vmax=50e-6)) #sm.set_array([]) #cbar = plt.colorbar(sm) #cbar.set_label('Time') pass - plt.legend() - plt.show() + ax.legend() + fig.savefig(get_filename(trajectory_file, "xy_trajectory")) + if SHOW_PLOTS: + fig.show() @app.command() -def phase_space_plot(trajectory_file: str, velocity_file: str, axis: Literal['x', 'y', 'z'] = 'z'): +def phase_space_plot(trajectory_file: Path, velocity_file: Path, axis: Literal['x', 'y', 'z'] = 'z'): """Plot phase space (Z vs Vz) from trajectory and velocity files.""" + plt.rcParams.update(get_rc_params()) + fig, ax = plt.subplots() axis_index = {'x': 0, 'y': 1, 'z': 2}[axis] traj_data, step_count, particle_count = load_trajectory_data(trajectory_file) vel_data, _, _ = load_trajectory_data(velocity_file) for i in range(particle_count): - plt.plot(traj_data[axis_index, i, :] * 1e-6, vel_data[axis_index, i, :] * 1e-6, label=f'Particle {i+1}') - plt.xlabel(f'{axis.upper()} Position (m)') - plt.ylabel(f'{axis.upper()} Velocity (m/s)') - plt.title(f'Phase Space Plot ({axis.upper()} vs V{axis.upper()})') - plt.legend() - plt.show() + ax.plot(traj_data[axis_index, i, :] * 1e-6, vel_data[axis_index, i, :] * 1e-6, label=f'Particle {i+1}') + ax.set_xlabel(f'{axis.upper()} Position (m)') + ax.set_ylabel(f'{axis.upper()} Velocity (m/s)') + ax.set_title(f'Phase Space Plot ({axis.upper()} vs V{axis.upper()})') + ax.legend() + fig.savefig(get_filename(trajectory_file, f"phase_space_{axis}")) + if SHOW_PLOTS: + fig.show() @app.command() -def plot_error(trajectory_files: list[str], analytical_file: str): +def plot_error(trajectory_files: list[Path], analytical_file: Path): """Plot error between numerical and analytical trajectories.""" + plt.rcParams.update(get_rc_params()) + fig, ax = plt.subplots() analytical_data, step_count, particle_count = load_trajectory_data(analytical_file) time = np.linspace(0, 50e-6, step_count) for traj_file in trajectory_files: numerical_data, _, _ = load_trajectory_data(traj_file) error = numerical_data - analytical_data relative_error = np.mean(np.linalg.norm(error, axis=0) / np.linalg.norm(analytical_data, axis=0), axis=0) - plt.plot(time, relative_error, label=os.path.basename(traj_file)) - plt.xlabel('Time (s)') - plt.ylabel('Relative Error') - plt.title('Relative Error between Numerical and Analytical Trajectories') - plt.legend() - plt.show() + ax.plot(time, relative_error, label=os.path.basename(traj_file)) + ax.set_xlabel('Time (s)') + ax.set_ylabel('Relative Error') + ax.set_title('Relative Error between Numerical and Analytical Trajectories') + ax.legend() + fig.savefig(get_filename(analytical_file, "error_plot")) + if SHOW_PLOTS: + fig.show() if __name__ == "__main__": app() \ No newline at end of file diff --git a/src/project3/src/solvers.cpp b/src/project3/src/solvers.cpp index 5a88cdc..524fa59 100644 --- a/src/project3/src/solvers.cpp +++ b/src/project3/src/solvers.cpp @@ -294,6 +294,26 @@ AnalyticalSolver::AnalyticalSolver(PenningTrap& trap_in, double dt_in) } } +BorisSolver::BorisSolver(PenningTrap& trap_in, double dt_in) + : Solver(trap_in, dt_in) {} + +void BorisSolver::step() { + int n = trap.num_particles(); + for (int i = 0; i < n; i++) { + Particle& p = trap.get_particle(i); + arma::vec E = trap.external_E_field(p.position, steps * dt); + E += trap.total_force_particles(i) / p.charge; // Add Coulomb force as effective E-field + arma::vec B = trap.external_B_field(p.position, steps * dt); + arma:: vec t = (p.charge * B / p.mass) * (dt / 2.0); + arma::vec s = 2.0 * t / (1.0 + arma::dot(t, t)); + arma::vec v_minus = p.velocity + (p.charge * E / p.mass) * (dt / 2.0); + arma::vec v_prime = v_minus + arma::cross(v_minus, t); + arma::vec v_plus = v_minus + arma::cross(v_prime, s); + p.velocity = v_plus + (p.charge * E / p.mass) * (dt / 2.0); + p.position += p.velocity * dt; + } +} + // Perform a single Analytical "integration" step void AnalyticalSolver::step() { int n = trap.num_particles(); diff --git a/src/project3/two_particles.cpp b/src/project3/two_particles.cpp index f247d2d..f06ac23 100644 --- a/src/project3/two_particles.cpp +++ b/src/project3/two_particles.cpp @@ -31,6 +31,9 @@ int main(int argc, char* argv[]) { program.add_argument("-V", "--velocity-verlet") .help("Use Velocity Verlet solver instead of RK4") .flag(); + program.add_argument("-B", "--boris") + .help("Use Boris solver instead of RK4") + .flag(); try { program.parse_args(argc, argv); @@ -46,6 +49,7 @@ int main(int argc, char* argv[]) { bool use_euler = program.get("--euler"); bool use_analytical = program.get("--analytical"); bool use_velocity_verlet = program.get("--velocity-verlet"); + bool use_boris = program.get("--boris"); double B_0 = 1.0; // Tesla double V_0 = 0.025; // Volt @@ -71,52 +75,29 @@ int main(int argc, char* argv[]) { double dt = 50e-6 / N; // seconds + unique_ptr solver; + string solver_name; + if (use_euler) { - EulerSolver solver(trap, dt); - solver.simulate(N); - solver.save("results/two_particles_" + std::to_string(n_particles) + (interactions ? "_with_interactions_" : "_no_interactions_") + std::to_string(N) + "_steps_euler"); - vector positions = solver.get_positions(); - cout << "Final position of particle 1: " << endl; - cout << positions.back().col(0) << endl; - if (n_particles > 1) { - cout << "Final position of particle 2: " << endl; - cout << positions.back().col(1) << endl; - } - return 0; + solver = make_unique(trap, dt); + solver_name = "euler"; + } else if (use_velocity_verlet) { + solver = make_unique(trap, dt); + solver_name = "velocity_verlet"; + } else if (use_boris) { + solver = make_unique(trap, dt); + solver_name = "boris"; + } else if (use_analytical) { + solver = make_unique(trap, dt); + solver_name = "analytical"; + } else { + solver = make_unique(trap, dt); + solver_name = "rk4"; } - if (use_analytical) { - AnalyticalSolver solver(trap, dt); - solver.simulate(N); - solver.save("results/two_particles_" + std::to_string(n_particles) + (interactions ? "_with_interactions_" : "_no_interactions_") + std::to_string(N) + "_steps_analytical"); - vector positions = solver.get_positions(); - cout << "Final position of particle 1: " << endl; - cout << positions.back().col(0) << endl; - if (n_particles > 1) { - cout << "Final position of particle 2: " << endl; - cout << positions.back().col(1) << endl; - } - return 0; - } - - if (use_velocity_verlet) { - VelocityVerletSolver solver(trap, dt); - solver.simulate(N); - solver.save("results/two_particles_" + std::to_string(n_particles) + (interactions ? "_with_interactions_" : "_no_interactions_") + std::to_string(N) + "_steps_velocity_verlet"); - vector positions = solver.get_positions(); - cout << "Final position of particle 1: " << endl; - cout << positions.back().col(0) << endl; - if (n_particles > 1) { - cout << "Final position of particle 2: " << endl; - cout << positions.back().col(1) << endl; - } - return 0; - } - - RK4Solver solver(trap, dt); - solver.simulate(N); - solver.save("results/two_particles_" + std::to_string(n_particles) + (interactions ? "_with_interactions_" : "_no_interactions_") + std::to_string(N) + "_steps_rk4"); - vector positions = solver.get_positions(); + solver->simulate(N); + solver->save("results/two_particles_" + std::to_string(n_particles) + (interactions ? "_with_interactions_" : "_no_interactions_") + std::to_string(N) + "_steps_" + solver_name); + vector positions = solver->get_positions(); cout << "Final position of particle 1: " << endl; cout << positions.back().col(0) << endl; if (n_particles > 1) {