40 double w_0 =
T / MASS;
41 double w_z2 = (50. *
V / 1000.) / (MASS * 500. * 500.);
42 double w_p = (w_0 + std::sqrt(w_0 * w_0 - 2. * w_z2)) / 2.;
43 double w_n = (w_0 - std::sqrt(w_0 * w_0 - 2. * w_z2)) / 2.;
44 double A_p = (25. + w_n * 20.) / (w_n - w_p);
45 double A_n = -(25. + w_p * 20.) / (w_n - w_p);
46 std::complex<double> f =
47 A_p * std::exp(std::complex<double>(0., -w_p * t)) +
48 A_n * std::exp(std::complex<double>(0., -w_n * t));
49 vec_3d res{std::real(f), std::imag(f), 20. * std::cos(std::sqrt(w_z2) * t)};
80 "output/simulate_2_particles/no_interaction", time, N,
"rk4",
false);
81 trap_with_interaction.write_simulation_to_dir(
82 "output/simulate_2_particles/with_interaction", time, N);
95 std::string path =
"output/relative_error/RK4/";
97 for (
int i = 0; i < 4; i++) {
98 int steps = 4000 * std::pow(2, i);
99 double dt = time / (double)steps;
100 ofile.open(path + std::to_string(steps) +
"_steps.txt");
102 simulation_t res = trap.simulate(time, steps,
"rk4",
false);
103 for (
int i = 0; i < steps; i++) {
104 ofile << arma::norm(res.r_vecs[0][i] -
112 path =
"output/relative_error/euler/";
114 for (
int i = 0; i < 4; i++) {
115 int steps = 4000 * std::pow(2, i);
116 double dt = time / (double)steps;
117 ofile.open(path + std::to_string(steps) +
"_steps.txt");
119 simulation_t res = trap.simulate(time, steps,
"euler",
false);
120 for (
int i = 0; i < steps; i++) {
121 ofile << arma::norm(res.r_vecs[0][i] -
150 double amplitudes[]{.1, .4, .7};
152 double freq_start = .2;
153 double freq_end = 2.5;
154 double freq_increment = .02;
155 size_t freq_iterations = (size_t)((freq_end - freq_start) / freq_increment);
157 double res[4][freq_iterations];
159 std::string path =
"output/time_dependent_potential/";
164 double freq = freq_start;
165 for (
size_t i = 0; i < freq_iterations; i++) {
167 freq += freq_increment;
170#pragma omp parallel for collapse(2) num_threads(4)
171 for (
size_t i = 0; i < 3; i++) {
172 for (
size_t j = 0; j < freq_iterations; j++) {
176 [](
double f,
double r,
double t) {
177 return (25. *
V / 1000.) * (1. + f * std::cos(r * t));
179 amplitudes[i], res[0][j], std::placeholders::_1),
186 ofile.open(path +
"res.txt");
187 for (
size_t i = 0; i < freq_iterations; i++) {
188 ofile << res[0][i] <<
"," << res[1][i] <<
"," << res[2][i] <<
","
189 << res[3][i] <<
"\n";
196 double t0 = omp_get_wtime();
204 double t1 = omp_get_wtime();
210 double end = omp_get_wtime();
212 std::cout <<
"Time: " << (end - t1) <<
" seconds" << std::endl;
A class for simulating a Penning trap.
A class that holds attributes of a particle.
A class that simulates a Penning trap.
double fraction_of_particles_left(double time, unsigned int steps, std::string method="rk4", bool particle_interaction=true)
Simulate and calculate what fraction of particles are still left inside the Penning trap after the si...
void write_simulation_to_dir(std::string path, double time, unsigned int steps, std::string method="rk4", bool particle_interaction=true)
Simulate and write the displacement of all particles to files.
void simulate_100_particles()
Simulate 100 particles over 50 .
void simulate_100_particles_with_time_potential()
Simulate 100 particles over 500 using a time dependent potential.
vec_3d analytical_solution_particle_1(double t)
The analytical solution for particle p1.
void simulate_two_particles()
Simulate 2 particles over the period of 50 with and without particle interactions.
Particle p1(CHARGE, MASS, vec_3d{20., 0., 20.}, vec_3d{0., 25., 0.})
Particle 1.
void simulate_single_particle()
Simulate a single particle over the period of 50 .
Particle p2(CHARGE, MASS, vec_3d{25., 25., 0.}, vec_3d{0., 40., 5.})
Particle 2.
void simulate_single_particle_with_different_steps()
Simulate a single particle over 50 using different amount of steps and different methods.
Typedef for PenningTrap::simulation return value.
arma::vec::fixed< 3 > vec_3d
Typedef for a fixed 3d arma vector.
Function prototypes and macros that are useful.
bool mkpath(std::string path, int mode=0777)
Make path given.