This commit is contained in:
Cory Balaton 2023-10-17 17:01:50 +02:00
parent 95432102ea
commit 5ed7cedfae
No known key found for this signature in database
GPG Key ID: 3E5FCEBFD80F432B
26 changed files with 142 additions and 1779 deletions

1
.gitignore vendored
View File

@ -47,3 +47,4 @@ src/*
!src/*.hpp !src/*.hpp
!src/*.py !src/*.py
!src/Doxyfile !src/Doxyfile
!src/scripts

View File

@ -2174,7 +2174,7 @@ RTF_EXTENSIONS_FILE =
# classes and files. # classes and files.
# The default value is: NO. # The default value is: NO.
GENERATE_MAN = YES GENERATE_MAN = NO
# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a # The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of

View File

@ -22,6 +22,11 @@
#pragma omp declare reduction(+ : vec_3d : omp_out += omp_in) \ #pragma omp declare reduction(+ : vec_3d : omp_out += omp_in) \
initializer(omp_priv = omp_orig) initializer(omp_priv = omp_orig)
typedef struct simulation {
sim_arr r_vecs;
sim_arr v_vecs;
} simulation_t;
/** @brief A class that simulates a Penning trap. /** @brief A class that simulates a Penning trap.
* *
* This class simulates a Penning trap. It can take in a number of particles * This class simulates a Penning trap. It can take in a number of particles
@ -188,7 +193,7 @@ public:
* @param method The method to use when moving forward a timestep * @param method The method to use when moving forward a timestep
* @param particle_interaction Turn particle interactions on/off * @param particle_interaction Turn particle interactions on/off
* */ * */
sim_arr simulate(double time, unsigned int steps, simulation_t simulate(double time, unsigned int steps,
std::string method = "rk4", std::string method = "rk4",
bool particle_interaction = true); bool particle_interaction = true);

Binary file not shown.

Binary file not shown.

View File

@ -1,111 +0,0 @@
.TH "Particle" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
Particle \- A class that holds attributes of a particle\&.
.SH SYNOPSIS
.br
.PP
.PP
\fC#include <Particle\&.hpp>\fP
.SS "Public Member Functions"
.in +1c
.ti -1c
.RI "\fBParticle\fP (double \fBq\fP, double \fBm\fP, \fBvec_3d\fP \fBr_vec\fP, \fBvec_3d\fP \fBv_vec\fP)"
.br
.RI "Initialize the particle\&. "
.in -1c
.SS "Private Attributes"
.in +1c
.ti -1c
.RI "double \fBq\fP"
.br
.RI "Charge\&. "
.ti -1c
.RI "double \fBm\fP"
.br
.RI "Mass\&. "
.ti -1c
.RI "\fBvec_3d\fP \fBr_vec\fP"
.br
.RI "position "
.ti -1c
.RI "\fBvec_3d\fP \fBv_vec\fP"
.br
.RI "velocity "
.in -1c
.SS "Friends"
.in +1c
.ti -1c
.RI "class \fBPenningTrap\fP"
.br
.RI "Make private attributes available for \fBPenningTrap\fP\&. "
.in -1c
.SH "Detailed Description"
.PP
A class that holds attributes of a particle\&.
.PP
Definition at line \fB21\fP of file \fBParticle\&.hpp\fP\&.
.SH "Constructor & Destructor Documentation"
.PP
.SS "Particle::Particle (double q, double m, \fBvec_3d\fP r_vec, \fBvec_3d\fP v_vec)"
.PP
Initialize the particle\&. Initialize the particle with a charge, mass, position and velocity\&.
.PP
\fBParameters\fP
.RS 4
\fIq\fP The charge of the particle
.br
\fIm\fP The mass of the particle
.br
\fIr_vec\fP The initial position of the particle
.br
\fIv_vec\fP The initial velocity of the particle
.RE
.PP
.PP
Definition at line \fB15\fP of file \fBParticle\&.cpp\fP\&.
.SH "Friends And Related Function Documentation"
.PP
.SS "friend class \fBPenningTrap\fP\fC [friend]\fP"
.PP
Make private attributes available for \fBPenningTrap\fP\&.
.PP
Definition at line \fB43\fP of file \fBParticle\&.hpp\fP\&.
.SH "Member Data Documentation"
.PP
.SS "double Particle::m\fC [private]\fP"
.PP
Mass\&.
.PP
Definition at line \fB24\fP of file \fBParticle\&.hpp\fP\&.
.SS "double Particle::q\fC [private]\fP"
.PP
Charge\&.
.PP
Definition at line \fB23\fP of file \fBParticle\&.hpp\fP\&.
.SS "\fBvec_3d\fP Particle::r_vec\fC [private]\fP"
.PP
position
.PP
Definition at line \fB25\fP of file \fBParticle\&.hpp\fP\&.
.SS "\fBvec_3d\fP Particle::v_vec\fC [private]\fP"
.PP
velocity
.PP
Definition at line \fB26\fP of file \fBParticle\&.hpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,42 +0,0 @@
.TH "src/Particle.cpp" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
src/Particle.cpp \- The implementation of the \fBParticle\fP class\&.
.SH SYNOPSIS
.br
.PP
\fC#include 'Particle\&.hpp'\fP
.br
.SH "Detailed Description"
.PP
The implementation of the \fBParticle\fP class\&.
.PP
\fBAuthor\fP
.RS 4
Cory Alexander Balaton (coryab)
.PP
Janita Ovidie Sandtrøen Willumsen (janitaws)
.RE
.PP
\fBVersion\fP
.RS 4
0\&.1
.RE
.PP
.PP
\fBBug\fP
.RS 4
No known bugs
.RE
.PP
.PP
Definition in file \fBParticle\&.cpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,52 +0,0 @@
.TH "include/Particle.hpp" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
include/Particle.hpp \- A class that holds the properties of a particle\&.
.SH SYNOPSIS
.br
.PP
\fC#include <armadillo>\fP
.br
\fC#include 'typedefs\&.hpp'\fP
.br
.SS "Classes"
.in +1c
.ti -1c
.RI "class \fBParticle\fP"
.br
.RI "A class that holds attributes of a particle\&. "
.in -1c
.SH "Detailed Description"
.PP
A class that holds the properties of a particle\&.
.PP
\fBAuthor\fP
.RS 4
Cory Alexander Balaton (coryab)
.PP
Janita Ovidie Sandtrøen Willumsen (janitaws)
.RE
.PP
\fBVersion\fP
.RS 4
0\&.1
.RE
.PP
.PP
\fBBug\fP
.RS 4
No known bugs
.RE
.PP
.PP
Definition in file \fBParticle\&.hpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,494 +0,0 @@
.TH "PenningTrap" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
PenningTrap \- A class that simulates a Penning trap\&.
.SH SYNOPSIS
.br
.PP
.PP
\fC#include <PenningTrap\&.hpp>\fP
.SS "Public Member Functions"
.in +1c
.ti -1c
.RI "\fBPenningTrap\fP (double \fBB_0\fP=\fBT\fP, std::function< double(double)> \fBV_0\fP=[](double \fBt\fP) { return 25\&. *\fBV\fP/1000\&.;}, double \fBd\fP=500\&., double \fBt\fP=0\&.)"
.br
.RI "Constructor for the \fBPenningTrap\fP class\&. "
.ti -1c
.RI "\fBPenningTrap\fP (unsigned int i, double \fBB_0\fP=\fBT\fP, std::function< double(double)> \fBV_0\fP=[](double \fBt\fP) { return 25\&. *\fBV\fP/1000\&.;}, double \fBd\fP=500\&., double \fBt\fP=0\&.)"
.br
.RI "Constructor for the \fBPenningTrap\fP class\&. "
.ti -1c
.RI "\fBPenningTrap\fP (std::vector< \fBParticle\fP > \fBparticles\fP, double \fBB_0\fP=\fBT\fP, std::function< double(double)> \fBV_0\fP=[](double \fBt\fP) { return 25\&. *\fBV\fP/1000\&.;}, double \fBd\fP=500\&., double \fBt\fP=0\&.)"
.br
.RI "Constructor for the \fBPenningTrap\fP class\&. "
.ti -1c
.RI "void \fBadd_particle\fP (\fBParticle\fP particle)"
.br
.RI "Add a particle to the system\&. "
.ti -1c
.RI "\fBvec_3d\fP \fBexternal_E_field\fP (\fBvec_3d\fP r)"
.br
.RI "Calculate E at point r\&. "
.ti -1c
.RI "\fBvec_3d\fP \fBexternal_B_field\fP (\fBvec_3d\fP r)"
.br
.RI "Calculate B at point r\&. "
.ti -1c
.RI "\fBvec_3d\fP \fBforce_on_particle\fP (unsigned int i, unsigned int j)"
.br
.RI "Calculate the force between 2 particles\&. "
.ti -1c
.RI "\fBvec_3d\fP \fBtotal_force_external\fP (unsigned int i)"
.br
.RI "Calculate the total external force on a particle\&. "
.ti -1c
.RI "\fBvec_3d\fP \fBtotal_force_particles\fP (unsigned int i)"
.br
.RI "Calculate the total force on a particle p_i from other particles\&. "
.ti -1c
.RI "\fBvec_3d\fP \fBtotal_force\fP (unsigned int i)"
.br
.RI "calculate the total force on a particle p_i\&. "
.ti -1c
.RI "void \fBevolve_RK4\fP (double dt, bool particle_interaction=true)"
.br
.RI "Go forward one timestep using the RK4 method\&. "
.ti -1c
.RI "void \fBevolve_forward_euler\fP (double dt, bool particle_interaction=true)"
.br
.RI "Go forward one timestep using the forward Euler method\&. "
.ti -1c
.RI "\fBsim_arr\fP \fBsimulate\fP (double time, unsigned int steps, std::string method='rk4', bool particle_interaction=true)"
.br
.RI "Simulate the particle system inside the Penning trap over a certain amount of time\&. "
.ti -1c
.RI "void \fBwrite_simulation_to_dir\fP (std::string path, double time, unsigned int steps, std::string method='rk4', bool particle_interaction=true)"
.br
.RI "Simulate and write the displacement of all particles to files\&. "
.ti -1c
.RI "double \fBfraction_of_particles_left\fP (double time, unsigned int steps, std::string method='rk4', bool particle_interaction=true)"
.br
.RI "Simulate and calculate what fraction of particles are still left inside the Penning trap after the simulation\&. "
.in -1c
.SS "Private Member Functions"
.in +1c
.ti -1c
.RI "\fBvec_3d\fP \fBv_func\fP (unsigned int i, unsigned int j, double dt)"
.br
.RI "Helper for evolve_RK4 when calculating $k_{v,i,j}$ values\&. "
.ti -1c
.RI "\fBvec_3d\fP \fBr_func\fP (unsigned int i, unsigned int j, double dt)"
.br
.RI "Helper for evolve_RK4 when calculating $k_{r,i,j}$ values\&. "
.in -1c
.SS "Private Attributes"
.in +1c
.ti -1c
.RI "double \fBB_0\fP"
.br
.RI "Magnetic field strength\&. "
.ti -1c
.RI "std::function< double(double)> \fBV_0\fP"
.br
.RI "Applied potential\&. "
.ti -1c
.RI "double \fBd\fP"
.br
.RI "Characteristic dimension\&. "
.ti -1c
.RI "double \fBt\fP"
.br
.RI "Current time\&. "
.ti -1c
.RI "std::vector< \fBParticle\fP > \fBparticles\fP"
.br
.RI "The particles in the Penning trap\&. "
.ti -1c
.RI "\fBsim_arr\fP \fBk_v\fP"
.br
.ti -1c
.RI "\fBsim_arr\fP \fBk_r\fP"
.br
.in -1c
.SH "Detailed Description"
.PP
A class that simulates a Penning trap\&.
This class simulates a Penning trap\&. It can take in a number of particles and simulate how they would behave inside a Penning trap\&.
.PP
Definition at line \fB30\fP of file \fBPenningTrap\&.hpp\fP\&.
.SH "Constructor & Destructor Documentation"
.PP
.SS "PenningTrap::PenningTrap (double B_0 = \fC\fBT\fP\fP, std::function< double(double)> V_0 = \fC[](double \fBt\fP) { return 25\&. * \fBV\fP / 1000\&.; }\fP, double d = \fC500\&.\fP, double t = \fC0\&.\fP)"
.PP
Constructor for the \fBPenningTrap\fP class\&.
.PP
\fBParameters\fP
.RS 4
\fIB_0\fP The magnetic field strength
.br
\fIV_0\fP The time dependent applied potential
.br
\fId\fP The characteristic dimension
.br
\fIt\fP The starting time
.RE
.PP
.PP
Definition at line \fB18\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "PenningTrap::PenningTrap (unsigned int i, double B_0 = \fC\fBT\fP\fP, std::function< double(double)> V_0 = \fC[](double \fBt\fP) { return 25\&. * \fBV\fP / 1000\&.; }\fP, double d = \fC500\&.\fP, double t = \fC0\&.\fP)"
.PP
Constructor for the \fBPenningTrap\fP class\&.
.PP
\fBParameters\fP
.RS 4
\fIi\fP The number of particles to generate
.br
\fIB_0\fP The magnetic field strength
.br
\fIV_0\fP The time dependent applied potential
.br
\fId\fP The characteristic dimension
.br
\fIt\fP The starting time
.RE
.PP
.PP
Definition at line \fB27\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "PenningTrap::PenningTrap (std::vector< \fBParticle\fP > particles, double B_0 = \fC\fBT\fP\fP, std::function< double(double)> V_0 = \fC[](double \fBt\fP) { return 25\&. * \fBV\fP / 1000\&.; }\fP, double d = \fC500\&.\fP, double t = \fC0\&.\fP)"
.PP
Constructor for the \fBPenningTrap\fP class\&.
.PP
\fBParameters\fP
.RS 4
\fIparticles\fP The starting particles
.br
\fIB_0\fP The magnetic field strength
.br
\fIV_0\fP The time dependent applied potential
.br
\fId\fP The characteristic dimension
.br
\fIt\fP The starting time
.RE
.PP
.PP
Definition at line \fB39\fP of file \fBPenningTrap\&.cpp\fP\&.
.SH "Member Function Documentation"
.PP
.SS "void PenningTrap::add_particle (\fBParticle\fP particle)"
.PP
Add a particle to the system\&.
.PP
\fBParameters\fP
.RS 4
\fIparticle\fP The particle to add to the Penning trap
.RE
.PP
.PP
Definition at line \fB82\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "void PenningTrap::evolve_forward_euler (double dt, bool particle_interaction = \fCtrue\fP)"
.PP
Go forward one timestep using the forward Euler method\&.
.PP
\fBParameters\fP
.RS 4
\fIdt\fP The step length
.br
\fIparticle_interaction\fP Turn particle interactions on/off
.RE
.PP
.PP
Definition at line \fB186\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "void PenningTrap::evolve_RK4 (double dt, bool particle_interaction = \fCtrue\fP)"
.PP
Go forward one timestep using the RK4 method\&.
.PP
\fBParameters\fP
.RS 4
\fIdt\fP The step length
.br
\fIparticle_interaction\fP Turn particle interactions on/off
.RE
.PP
.PP
Definition at line \fB151\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "\fBvec_3d\fP PenningTrap::external_B_field (\fBvec_3d\fP r)"
.PP
Calculate B at point r\&.
.PP
\fBParameters\fP
.RS 4
\fIr\fP The position where we want to calculate the B field
.RE
.PP
\fBReturns\fP
.RS 4
vec_3d
.RE
.PP
.PP
Definition at line \fB95\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "\fBvec_3d\fP PenningTrap::external_E_field (\fBvec_3d\fP r)"
.PP
Calculate E at point r\&.
.PP
\fBParameters\fP
.RS 4
\fIr\fP The position where we want to calculate the E field
.RE
.PP
\fBReturns\fP
.RS 4
vec_3d
.RE
.PP
.PP
Definition at line \fB87\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "\fBvec_3d\fP PenningTrap::force_on_particle (unsigned int i, unsigned int j)"
.PP
Calculate the force between 2 particles\&. Calculate the force exhibited on particle p_i from particle p_j\&.
.PP
\fBParameters\fP
.RS 4
\fIi\fP The index of particle p_i
.br
\fIj\fP The index of particle p_j
.RE
.PP
\fBReturns\fP
.RS 4
vec_3d
.RE
.PP
.PP
Definition at line \fB100\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "double PenningTrap::fraction_of_particles_left (double time, unsigned int steps, std::string method = \fC'rk4'\fP, bool particle_interaction = \fCtrue\fP)"
.PP
Simulate and calculate what fraction of particles are still left inside the Penning trap after the simulation\&.
.PP
\fBParameters\fP
.RS 4
\fItime\fP The time to simulate in microseconds
.br
\fIsteps\fP The amount of steps for the whole simulation
.br
\fImethod\fP The method to use when moving forward a timestep
.br
\fIparticle_interaction\fP Turn particle interactions on/off
.RE
.PP
\fBReturns\fP
.RS 4
double
.RE
.PP
.PP
Definition at line \fB266\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "\fBvec_3d\fP PenningTrap::r_func (unsigned int i, unsigned int j, double dt)\fC [private]\fP"
.PP
Helper for evolve_RK4 when calculating $k_{r,i,j}$ values\&. Something
.PP
\fBParameters\fP
.RS 4
\fIi\fP Index i for $k_{r,i,j}$
.br
\fIj\fP Index j for $k_{r,i,j}$
.br
\fIdt\fP the step length (delta time)
.RE
.PP
\fBReturns\fP
.RS 4
vec_3d
.RE
.PP
.PP
Definition at line \fB64\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "\fBsim_arr\fP PenningTrap::simulate (double time, unsigned int steps, std::string method = \fC'rk4'\fP, bool particle_interaction = \fCtrue\fP)"
.PP
Simulate the particle system inside the Penning trap over a certain amount of time\&.
.PP
\fBParameters\fP
.RS 4
\fItime\fP The time to simulate in microseconds
.br
\fIsteps\fP The amount of steps for the whole simulation
.br
\fImethod\fP The method to use when moving forward a timestep
.br
\fIparticle_interaction\fP Turn particle interactions on/off
.RE
.PP
.PP
Definition at line \fB211\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "\fBvec_3d\fP PenningTrap::total_force (unsigned int i)"
.PP
calculate the total force on a particle p_i\&.
.PP
\fBParameters\fP
.RS 4
\fIi\fP The index of particle p_i
.RE
.PP
\fBReturns\fP
.RS 4
vec_3d
.RE
.PP
.PP
Definition at line \fB146\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "\fBvec_3d\fP PenningTrap::total_force_external (unsigned int i)"
.PP
Calculate the total external force on a particle\&. Calculate the total amount of force that E and B exhibits on particle p_i\&.
.PP
\fBParameters\fP
.RS 4
\fIi\fP The index of particle p_i
.RE
.PP
\fBReturns\fP
.RS 4
vec_3d
.RE
.PP
.PP
Definition at line \fB114\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "\fBvec_3d\fP PenningTrap::total_force_particles (unsigned int i)"
.PP
Calculate the total force on a particle p_i from other particles\&.
.PP
\fBParameters\fP
.RS 4
\fIi\fP The index of particle p_i
.RE
.PP
\fBReturns\fP
.RS 4
vec_3d
.RE
.PP
.PP
Definition at line \fB129\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "\fBvec_3d\fP PenningTrap::v_func (unsigned int i, unsigned int j, double dt)\fC [private]\fP"
.PP
Helper for evolve_RK4 when calculating $k_{v,i,j}$ values\&. Something
.PP
\fBParameters\fP
.RS 4
\fIi\fP Index i for $k_{v,i,j}$
.br
\fIj\fP Index j for $k_{v,i,j}$
.br
\fIdt\fP the step length (delta time)
.RE
.PP
\fBReturns\fP
.RS 4
vec_3d
.RE
.PP
.PP
Definition at line \fB46\fP of file \fBPenningTrap\&.cpp\fP\&.
.SS "void PenningTrap::write_simulation_to_dir (std::string path, double time, unsigned int steps, std::string method = \fC'rk4'\fP, bool particle_interaction = \fCtrue\fP)"
.PP
Simulate and write the displacement of all particles to files\&.
.PP
\fBParameters\fP
.RS 4
\fIpath\fP The directory to save the data
.br
\fItime\fP The time to simulate in microseconds
.br
\fIsteps\fP The amount of steps for the whole simulation
.br
\fImethod\fP The method to use when moving forward a timestep
.br
\fIparticle_interaction\fP Turn particle interactions on/off
.RE
.PP
.PP
Definition at line \fB240\fP of file \fBPenningTrap\&.cpp\fP\&.
.SH "Member Data Documentation"
.PP
.SS "double PenningTrap::B_0\fC [private]\fP"
.PP
Magnetic field strength\&.
.PP
Definition at line \fB32\fP of file \fBPenningTrap\&.hpp\fP\&.
.SS "double PenningTrap::d\fC [private]\fP"
.PP
Characteristic dimension\&.
.PP
Definition at line \fB34\fP of file \fBPenningTrap\&.hpp\fP\&.
.SS "\fBsim_arr\fP PenningTrap::k_r\fC [private]\fP"
A 2D vector containing all $k_{i,j}$ where $j$ is the index of a particle
.PP
Definition at line \fB39\fP of file \fBPenningTrap\&.hpp\fP\&.
.SS "\fBsim_arr\fP PenningTrap::k_v\fC [private]\fP"
A 2D vector containing all $k_{i,j}$ where $j$ is the index of a particle
.PP
Definition at line \fB37\fP of file \fBPenningTrap\&.hpp\fP\&.
.SS "std::vector<\fBParticle\fP> PenningTrap::particles\fC [private]\fP"
.PP
The particles in the Penning trap\&.
.PP
Definition at line \fB36\fP of file \fBPenningTrap\&.hpp\fP\&.
.SS "double PenningTrap::t\fC [private]\fP"
.PP
Current time\&.
.PP
Definition at line \fB35\fP of file \fBPenningTrap\&.hpp\fP\&.
.SS "std::function<double(double)> PenningTrap::V_0\fC [private]\fP"
.PP
Applied potential\&.
.PP
Definition at line \fB33\fP of file \fBPenningTrap\&.hpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,48 +0,0 @@
.TH "src/PenningTrap.cpp" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
src/PenningTrap.cpp \- The implementation of the \fBPenningTrap\fP class\&.
.SH SYNOPSIS
.br
.PP
\fC#include 'PenningTrap\&.hpp'\fP
.br
\fC#include 'constants\&.hpp'\fP
.br
\fC#include 'typedefs\&.hpp'\fP
.br
\fC#include 'utils\&.hpp'\fP
.br
.SH "Detailed Description"
.PP
The implementation of the \fBPenningTrap\fP class\&.
.PP
\fBAuthor\fP
.RS 4
Cory Alexander Balaton (coryab)
.PP
Janita Ovidie Sandtrøen Willumsen (janitaws)
.RE
.PP
\fBVersion\fP
.RS 4
0\&.1
.RE
.PP
.PP
\fBBug\fP
.RS 4
No known bugs
.RE
.PP
.PP
Definition in file \fBPenningTrap\&.cpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,58 +0,0 @@
.TH "include/PenningTrap.hpp" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
include/PenningTrap.hpp \- A class for simulating a Penning trap\&.
.SH SYNOPSIS
.br
.PP
\fC#include <armadillo>\fP
.br
\fC#include <omp\&.h>\fP
.br
\fC#include 'Particle\&.hpp'\fP
.br
\fC#include 'constants\&.hpp'\fP
.br
\fC#include 'typedefs\&.hpp'\fP
.br
.SS "Classes"
.in +1c
.ti -1c
.RI "class \fBPenningTrap\fP"
.br
.RI "A class that simulates a Penning trap\&. "
.in -1c
.SH "Detailed Description"
.PP
A class for simulating a Penning trap\&.
.PP
\fBAuthor\fP
.RS 4
Cory Alexander Balaton (coryab)
.PP
Janita Ovidie Sandtrøen Willumsen (janitaws)
.RE
.PP
\fBVersion\fP
.RS 4
0\&.1
.RE
.PP
.PP
\fBBug\fP
.RS 4
No known bugs
.RE
.PP
.PP
Definition in file \fBPenningTrap\&.hpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,56 +0,0 @@
.TH "PenningTrapTest" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
PenningTrapTest
.SH SYNOPSIS
.br
.PP
.SS "Static Public Member Functions"
.in +1c
.ti -1c
.RI "static void \fBtest_external_E_field\fP ()"
.br
.ti -1c
.RI "static void \fBtest_external_B_field\fP ()"
.br
.ti -1c
.RI "static void \fBtest_force_on_particle\fP ()"
.br
.ti -1c
.RI "static void \fBtest_total_force_external\fP ()"
.br
.ti -1c
.RI "static void \fBtest_total_force_particles\fP ()"
.br
.in -1c
.SH "Detailed Description"
.PP
Definition at line \fB20\fP of file \fBtest_suite\&.cpp\fP\&.
.SH "Member Function Documentation"
.PP
.SS "static void PenningTrapTest::test_external_B_field ()\fC [inline]\fP, \fC [static]\fP"
.PP
Definition at line \fB59\fP of file \fBtest_suite\&.cpp\fP\&.
.SS "static void PenningTrapTest::test_external_E_field ()\fC [inline]\fP, \fC [static]\fP"
.PP
Definition at line \fB22\fP of file \fBtest_suite\&.cpp\fP\&.
.SS "static void PenningTrapTest::test_force_on_particle ()\fC [inline]\fP, \fC [static]\fP"
.PP
Definition at line \fB70\fP of file \fBtest_suite\&.cpp\fP\&.
.SS "static void PenningTrapTest::test_total_force_external ()\fC [inline]\fP, \fC [static]\fP"
.PP
Definition at line \fB95\fP of file \fBtest_suite\&.cpp\fP\&.
.SS "static void PenningTrapTest::test_total_force_particles ()\fC [inline]\fP, \fC [static]\fP"
.PP
Definition at line \fB108\fP of file \fBtest_suite\&.cpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,29 +0,0 @@
.TH "bug" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
bug \- Bug List
.PP
.IP "\fBFile \fBconstants\&.hpp\fP \fP" 1c
No known bugs
.IP "\fBFile \fBmain\&.cpp\fP \fP" 1c
No known bugs
.IP "\fBFile \fBParticle\&.cpp\fP \fP" 1c
No known bugs
.IP "\fBFile \fBParticle\&.hpp\fP \fP" 1c
No known bugs
.IP "\fBFile \fBPenningTrap\&.cpp\fP \fP" 1c
No known bugs
.IP "\fBFile \fBPenningTrap\&.hpp\fP \fP" 1c
No known bugs
.IP "\fBFile \fBtest_suite\&.cpp\fP \fP" 1c
No known bugs
.IP "\fBFile \fBtypedefs\&.hpp\fP \fP" 1c
No known bugs
.IP "\fBFile \fButils\&.cpp\fP \fP" 1c
No known bugs
.IP "\fBFile \fButils\&.hpp\fP \fP" 1c
No known bugs
.PP

View File

@ -1,75 +0,0 @@
.TH "include/constants.hpp" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
include/constants.hpp \- Library of constants\&.
.SH SYNOPSIS
.br
.PP
.SS "Macros"
.in +1c
.ti -1c
.RI "#define \fBK_E\fP 138935\&.333"
.br
.RI "Coulomb constant\&. unit: $\frac{u(\mu m)^3}{(\mu s)^2 e^2}$\&. "
.ti -1c
.RI "#define \fBT\fP 96\&.4852558"
.br
.RI "1 Tesla\&. unit: $ \frac{u}{(\mu s) e} $ "
.ti -1c
.RI "#define \fBV\fP 96485255\&.8"
.br
.RI "1 Volt\&. unit: $ \frac{u (\mu m)^2}{(\mu s)^2 e} $ "
.in -1c
.SH "Detailed Description"
.PP
Library of constants\&.
.PP
\fBAuthor\fP
.RS 4
Cory Alexander Balaton (coryab)
.PP
Janita Ovidie Sandtrøen Willumsen (janitaws)
.RE
.PP
\fBVersion\fP
.RS 4
0\&.1
.RE
.PP
.PP
\fBBug\fP
.RS 4
No known bugs
.RE
.PP
.PP
Definition in file \fBconstants\&.hpp\fP\&.
.SH "Macro Definition Documentation"
.PP
.SS "#define K_E 138935\&.333"
.PP
Coulomb constant\&. unit: $\frac{u(\mu m)^3}{(\mu s)^2 e^2}$\&.
.PP
Definition at line \fB15\fP of file \fBconstants\&.hpp\fP\&.
.SS "#define T 96\&.4852558"
.PP
1 Tesla\&. unit: $ \frac{u}{(\mu s) e} $
.PP
Definition at line \fB17\fP of file \fBconstants\&.hpp\fP\&.
.SS "#define V 96485255\&.8"
.PP
1 Volt\&. unit: $ \frac{u (\mu m)^2}{(\mu s)^2 e} $
.PP
Definition at line \fB19\fP of file \fBconstants\&.hpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,148 +0,0 @@
.TH "src/main.cpp" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
src/main.cpp \- The main program for this project\&.
.SH SYNOPSIS
.br
.PP
\fC#include <cmath>\fP
.br
\fC#include <fstream>\fP
.br
\fC#include <omp\&.h>\fP
.br
\fC#include <string>\fP
.br
\fC#include <sys/stat\&.h>\fP
.br
\fC#include <vector>\fP
.br
\fC#include 'PenningTrap\&.hpp'\fP
.br
\fC#include 'utils\&.hpp'\fP
.br
.SS "Macros"
.in +1c
.ti -1c
.RI "#define \fBPARTICLES\fP 100"
.br
.ti -1c
.RI "#define \fBN\fP 10000"
.br
.ti -1c
.RI "#define \fBCHARGE\fP 1\&."
.br
.ti -1c
.RI "#define \fBMASS\fP 40\&."
.br
.in -1c
.SS "Functions"
.in +1c
.ti -1c
.RI "void \fBsimulate_single_particle\fP ()"
.br
.ti -1c
.RI "void \fBsimulate_two_particles\fP ()"
.br
.ti -1c
.RI "void \fBsimulate_single_particle_with_different_steps\fP ()"
.br
.ti -1c
.RI "void \fBsimulate_100_particles\fP ()"
.br
.ti -1c
.RI "void \fBsimulate_100_particles_with_time_potential\fP ()"
.br
.ti -1c
.RI "int \fBmain\fP ()"
.br
.in -1c
.SS "Variables"
.in +1c
.ti -1c
.RI "\fBParticle\fP \fBp1\fP (CHARGE, MASS, \fBvec_3d\fP{20\&., 0\&., 20\&.}, \fBvec_3d\fP{0\&., 25\&., 0\&.})"
.br
.ti -1c
.RI "\fBParticle\fP \fBp2\fP (CHARGE, MASS, \fBvec_3d\fP{25\&., 25\&., 0\&.}, \fBvec_3d\fP{0\&., 40\&., 5\&.})"
.br
.in -1c
.SH "Detailed Description"
.PP
The main program for this project\&.
.PP
\fBAuthor\fP
.RS 4
Cory Alexander Balaton (coryab)
.PP
Janita Ovidie Sandtrøen Willumsen (janitaws)
.RE
.PP
\fBVersion\fP
.RS 4
0\&.1
.RE
.PP
.PP
\fBBug\fP
.RS 4
No known bugs
.RE
.PP
.PP
Definition in file \fBmain\&.cpp\fP\&.
.SH "Macro Definition Documentation"
.PP
.SS "#define CHARGE 1\&."
.PP
Definition at line \fB25\fP of file \fBmain\&.cpp\fP\&.
.SS "#define MASS 40\&."
.PP
Definition at line \fB26\fP of file \fBmain\&.cpp\fP\&.
.SS "#define N 10000"
.PP
Definition at line \fB24\fP of file \fBmain\&.cpp\fP\&.
.SS "#define PARTICLES 100"
.PP
Definition at line \fB23\fP of file \fBmain\&.cpp\fP\&.
.SH "Function Documentation"
.PP
.SS "int main ()"
.PP
Definition at line \fB124\fP of file \fBmain\&.cpp\fP\&.
.SS "void simulate_100_particles ()"
.PP
Definition at line \fB77\fP of file \fBmain\&.cpp\fP\&.
.SS "void simulate_100_particles_with_time_potential ()"
.PP
Definition at line \fB91\fP of file \fBmain\&.cpp\fP\&.
.SS "void simulate_single_particle ()"
.PP
Definition at line \fB31\fP of file \fBmain\&.cpp\fP\&.
.SS "void simulate_single_particle_with_different_steps ()"
.PP
Definition at line \fB55\fP of file \fBmain\&.cpp\fP\&.
.SS "void simulate_two_particles ()"
.PP
Definition at line \fB42\fP of file \fBmain\&.cpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,70 +0,0 @@
.TH "src/test_suite.cpp" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
src/test_suite.cpp \- The test suite for the project\&.
.SH SYNOPSIS
.br
.PP
\fC#include 'PenningTrap\&.hpp'\fP
.br
\fC#include 'utils\&.hpp'\fP
.br
\fC#include <iomanip>\fP
.br
\fC#include <sstream>\fP
.br
\fC#include <string>\fP
.br
.SS "Classes"
.in +1c
.ti -1c
.RI "class \fBPenningTrapTest\fP"
.br
.in -1c
.SS "Functions"
.in +1c
.ti -1c
.RI "int \fBmain\fP ()"
.br
.in -1c
.SH "Detailed Description"
.PP
The test suite for the project\&.
.PP
\fBAuthor\fP
.RS 4
Cory Alexander Balaton (coryab)
.PP
Janita Ovidie Sandtrøen Willumsen (janitaws)
.RE
.PP
\fBVersion\fP
.RS 4
0\&.1
.RE
.PP
.PP
\fBBug\fP
.RS 4
No known bugs
.RE
.PP
.PP
Definition in file \fBtest_suite\&.cpp\fP\&.
.SH "Function Documentation"
.PP
.SS "int main ()"
.PP
Definition at line \fB135\fP of file \fBtest_suite\&.cpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,14 +0,0 @@
.TH "todo" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
todo \- Todo List
.PP
.IP "\fBFile \fBPenningTrap\&.cpp\fP \fP" 1c
Implement evolve_RK4
.PP
.PP
Implement evolve_forward_euler
.PP

View File

@ -1,92 +0,0 @@
.TH "include/typedefs.hpp" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
include/typedefs.hpp \- Useful typedefs for cleaner code\&.
.SH SYNOPSIS
.br
.PP
\fC#include <vector>\fP
.br
\fC#include <armadillo>\fP
.br
.SS "Typedefs"
.in +1c
.ti -1c
.RI "typedef std::vector< arma::vec::fixed< 3 > > \fBsim_cols\fP"
.br
.RI "Typedef for the column of the result vector from simulating particles\&. "
.ti -1c
.RI "typedef std::vector< arma::vec::fixed< 3 > > \fBsim_rows\fP"
.br
.RI "Typedef for the row of the result vector from simulating particles\&. "
.ti -1c
.RI "typedef std::vector< \fBsim_cols\fP > \fBsim_arr\fP"
.br
.RI "Typedef for the result of the simulate method\&. "
.ti -1c
.RI "typedef arma::vec::fixed< 3 > \fBvec_3d\fP"
.br
.RI "Typedef for a fixed 3d arma vector\&. "
.in -1c
.SH "Detailed Description"
.PP
Useful typedefs for cleaner code\&.
.PP
\fBAuthor\fP
.RS 4
Cory Alexander Balaton (coryab)
.PP
Janita Ovidie Sandtrøen Willumsen (janitaws)
.RE
.PP
\fBVersion\fP
.RS 4
1\&.0
.RE
.PP
.PP
These typedefs make the code more readable and easy to follow along\&.
.PP
\fBBug\fP
.RS 4
No known bugs
.RE
.PP
.PP
Definition in file \fBtypedefs\&.hpp\fP\&.
.SH "Typedef Documentation"
.PP
.SS "typedef std::vector<\fBsim_cols\fP> \fBsim_arr\fP"
.PP
Typedef for the result of the simulate method\&.
.PP
Definition at line \fB32\fP of file \fBtypedefs\&.hpp\fP\&.
.SS "typedef std::vector<arma::vec::fixed<3> > \fBsim_cols\fP"
.PP
Typedef for the column of the result vector from simulating particles\&.
.PP
Definition at line \fB24\fP of file \fBtypedefs\&.hpp\fP\&.
.SS "typedef std::vector<arma::vec::fixed<3> > \fBsim_rows\fP"
.PP
Typedef for the row of the result vector from simulating particles\&.
.PP
Definition at line \fB28\fP of file \fBtypedefs\&.hpp\fP\&.
.SS "typedef arma::vec::fixed<3> \fBvec_3d\fP"
.PP
Typedef for a fixed 3d arma vector\&.
.PP
Definition at line \fB36\fP of file \fBtypedefs\&.hpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,179 +0,0 @@
.TH "src/utils.cpp" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
src/utils.cpp \- Implementation of the utils\&.
.SH SYNOPSIS
.br
.PP
\fC#include <sys/stat\&.h>\fP
.br
\fC#include 'utils\&.hpp'\fP
.br
.SS "Functions"
.in +1c
.ti -1c
.RI "std::string \fBscientific_format\fP (double d, int width, int prec)"
.br
.RI "Turns a double into a string written in scientific format\&. "
.ti -1c
.RI "std::string \fBscientific_format\fP (const std::vector< double > &v, int width, int prec)"
.br
.RI "Turns a vector of doubles into a string written in scientific format\&. "
.ti -1c
.RI "void \fBm_assert\fP (bool expr, std::string expr_str, std::string f, std::string file, int line, std::string msg)"
.br
.RI "Test an expression, confirm that test is ok, or abort execution\&. "
.ti -1c
.RI "bool \fBarma_vector_close_to\fP (arma::vec &a, arma::vec &b, double tol)"
.br
.RI "Test if two armadillo vectors are close to each other\&. "
.ti -1c
.RI "bool \fBmkpath\fP (std::string path, int mode)"
.br
.RI "Make path given\&. "
.in -1c
.SH "Detailed Description"
.PP
Implementation of the utils\&.
.PP
\fBAuthor\fP
.RS 4
Cory Alexander Balaton (coryab)
.PP
Janita Ovidie Sandtrøen Willumsen (janitaws)
.RE
.PP
\fBVersion\fP
.RS 4
1\&.0
.RE
.PP
.PP
\fBBug\fP
.RS 4
No known bugs
.RE
.PP
.PP
Definition in file \fButils\&.cpp\fP\&.
.SH "Function Documentation"
.PP
.SS "bool arma_vector_close_to (arma::vec & a, arma::vec & b, double tol = \fC1e\-8\fP)"
.PP
Test if two armadillo vectors are close to each other\&. This function takes in 2 vectors and checks if they are approximately equal to each other given a tolerance\&.
.PP
\fBParameters\fP
.RS 4
\fIa\fP Vector a
.br
\fIb\fP Vector b
.br
\fItol\fP The tolerance
.RE
.PP
\fBReturns\fP
.RS 4
bool
.RE
.PP
.PP
Definition at line \fB62\fP of file \fButils\&.cpp\fP\&.
.SS "void m_assert (bool expr, std::string expr_str, std::string func, std::string file, int line, std::string msg)"
.PP
Test an expression, confirm that test is ok, or abort execution\&. This function takes in an expression and prints an OK message if it's true, or it prints a fail message and aborts execution if it fails\&.
.PP
\fBParameters\fP
.RS 4
\fIexpr\fP The expression to be evaluated
.br
\fIexpr_str\fP The stringified version of the expression
.br
\fIfunc\fP The function name of the caller
.br
\fIfile\fP The file of the caller
.br
\fIline\fP The line number where this function is called from
.br
\fImsg\fP The message to be displayed
.RE
.PP
.PP
Definition at line \fB43\fP of file \fButils\&.cpp\fP\&.
.SS "bool mkpath (std::string path, int mode = \fC0777\fP)"
.PP
Make path given\&. This tries to be the equivalent to 'mkdir -p' and creates a new directory whenever it needs to\&.
.PP
\fBParameters\fP
.RS 4
\fIpath\fP The path to be created
.br
\fImode\fP The mode/permissions for all the new directories
.RE
.PP
\fBReturns\fP
.RS 4
bool
.RE
.PP
.PP
Definition at line \fB76\fP of file \fButils\&.cpp\fP\&.
.SS "std::string scientific_format (const std::vector< double > & v, int width = \fC20\fP, int prec = \fC10\fP)"
.PP
Turns a vector of doubles into a string written in scientific format\&. The code is stolen from https://github.com/anderkve/FYS3150\&.
.PP
\fBParameters\fP
.RS 4
\fIv\fP The vector to stringify
.br
\fIwidth\fP The reserved width of the string
.br
\fIprec\fP The precision of the stringified number
.RE
.PP
\fBReturns\fP
.RS 4
std::string
.RE
.PP
.PP
Definition at line \fB24\fP of file \fButils\&.cpp\fP\&.
.SS "std::string scientific_format (double d, int width = \fC20\fP, int prec = \fC10\fP)"
.PP
Turns a double into a string written in scientific format\&. The code is stolen from https://github.com/anderkve/FYS3150\&.
.PP
\fBParameters\fP
.RS 4
\fId\fP The number to stringify
.br
\fIwidth\fP The reserved width of the string
.br
\fIprec\fP The precision of the stringified number
.RE
.PP
\fBReturns\fP
.RS 4
std::string
.RE
.PP
.PP
Definition at line \fB17\fP of file \fButils\&.cpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -1,228 +0,0 @@
.TH "include/utils.hpp" 3 "Sat Oct 14 2023" "Penning Trap Simulation" \" -*- nroff -*-
.ad l
.nh
.SH NAME
include/utils.hpp \- Function prototypes and macros that are useful\&.
.SH SYNOPSIS
.br
.PP
\fC#include <armadillo>\fP
.br
\fC#include <iomanip>\fP
.br
\fC#include <sstream>\fP
.br
\fC#include <string>\fP
.br
\fC#include <vector>\fP
.br
.SS "Macros"
.in +1c
.ti -1c
.RI "#define \fBDEBUG\fP(msg)"
.br
.RI "Writes a debug message\&. "
.ti -1c
.RI "#define \fBASSERT\fP(expr, msg)"
.br
.RI "A prettier assertion function\&. "
.ti -1c
.RI "#define \fB__METHOD_NAME__\fP methodName(__PRETTY_FUNCTION__)"
.br
.RI "Get the name of the current method/function\&. "
.in -1c
.SS "Functions"
.in +1c
.ti -1c
.RI "std::string \fBscientific_format\fP (double d, int width=20, int prec=10)"
.br
.RI "Turns a double into a string written in scientific format\&. "
.ti -1c
.RI "std::string \fBscientific_format\fP (const std::vector< double > &v, int width=20, int prec=10)"
.br
.RI "Turns a vector of doubles into a string written in scientific format\&. "
.ti -1c
.RI "void \fBm_assert\fP (bool expr, std::string expr_str, std::string func, std::string file, int line, std::string msg)"
.br
.RI "Test an expression, confirm that test is ok, or abort execution\&. "
.ti -1c
.RI "bool \fBarma_vector_close_to\fP (arma::vec &a, arma::vec &b, double tol=1e\-8)"
.br
.RI "Test if two armadillo vectors are close to each other\&. "
.ti -1c
.RI "bool \fBmkpath\fP (std::string path, int mode=0777)"
.br
.RI "Make path given\&. "
.in -1c
.SH "Detailed Description"
.PP
Function prototypes and macros that are useful\&.
.PP
\fBAuthor\fP
.RS 4
Cory Alexander Balaton (coryab)
.PP
Janita Ovidie Sandtrøen Willumsen (janitaws)
.RE
.PP
\fBVersion\fP
.RS 4
1\&.0
.RE
.PP
.PP
These utility function are mainly for convenience and aren't directly related to the project\&.
.PP
\fBBug\fP
.RS 4
No known bugs
.RE
.PP
.PP
Definition in file \fButils\&.hpp\fP\&.
.SH "Macro Definition Documentation"
.PP
.SS "#define __METHOD_NAME__ methodName(__PRETTY_FUNCTION__)"
.PP
Get the name of the current method/function\&.
.PP
Definition at line \fB51\fP of file \fButils\&.hpp\fP\&.
.SS "#define ASSERT(expr, msg)"
\fBValue:\fP.PP
.nf
m_assert(expr, #expr, __METHOD_NAME__, __FILE__, \\
__LINE__, msg)
.fi
.PP
A prettier assertion function\&. This macro calls the m_assert function which is a more informative assertion function than the regular assert function from cassert\&.
.PP
Definition at line \fB45\fP of file \fButils\&.hpp\fP\&.
.SS "#define DEBUG(msg)"
.PP
Writes a debug message\&. This macro writes a debug message that includes the filename, line number, and a custom message\&. The function is wrapped in an ifdef that checks if DBG is defined, so one can choose to display the debug messages by adding the -DDBG flag when compiling\&.
.PP
Definition at line \fB36\fP of file \fButils\&.hpp\fP\&.
.SH "Function Documentation"
.PP
.SS "bool arma_vector_close_to (arma::vec & a, arma::vec & b, double tol = \fC1e\-8\fP)"
.PP
Test if two armadillo vectors are close to each other\&. This function takes in 2 vectors and checks if they are approximately equal to each other given a tolerance\&.
.PP
\fBParameters\fP
.RS 4
\fIa\fP Vector a
.br
\fIb\fP Vector b
.br
\fItol\fP The tolerance
.RE
.PP
\fBReturns\fP
.RS 4
bool
.RE
.PP
.PP
Definition at line \fB62\fP of file \fButils\&.cpp\fP\&.
.SS "void m_assert (bool expr, std::string expr_str, std::string func, std::string file, int line, std::string msg)"
.PP
Test an expression, confirm that test is ok, or abort execution\&. This function takes in an expression and prints an OK message if it's true, or it prints a fail message and aborts execution if it fails\&.
.PP
\fBParameters\fP
.RS 4
\fIexpr\fP The expression to be evaluated
.br
\fIexpr_str\fP The stringified version of the expression
.br
\fIfunc\fP The function name of the caller
.br
\fIfile\fP The file of the caller
.br
\fIline\fP The line number where this function is called from
.br
\fImsg\fP The message to be displayed
.RE
.PP
.PP
Definition at line \fB43\fP of file \fButils\&.cpp\fP\&.
.SS "bool mkpath (std::string path, int mode = \fC0777\fP)"
.PP
Make path given\&. This tries to be the equivalent to 'mkdir -p' and creates a new directory whenever it needs to\&.
.PP
\fBParameters\fP
.RS 4
\fIpath\fP The path to be created
.br
\fImode\fP The mode/permissions for all the new directories
.RE
.PP
\fBReturns\fP
.RS 4
bool
.RE
.PP
.PP
Definition at line \fB76\fP of file \fButils\&.cpp\fP\&.
.SS "std::string scientific_format (const std::vector< double > & v, int width = \fC20\fP, int prec = \fC10\fP)"
.PP
Turns a vector of doubles into a string written in scientific format\&. The code is stolen from https://github.com/anderkve/FYS3150\&.
.PP
\fBParameters\fP
.RS 4
\fIv\fP The vector to stringify
.br
\fIwidth\fP The reserved width of the string
.br
\fIprec\fP The precision of the stringified number
.RE
.PP
\fBReturns\fP
.RS 4
std::string
.RE
.PP
.PP
Definition at line \fB24\fP of file \fButils\&.cpp\fP\&.
.SS "std::string scientific_format (double d, int width = \fC20\fP, int prec = \fC10\fP)"
.PP
Turns a double into a string written in scientific format\&. The code is stolen from https://github.com/anderkve/FYS3150\&.
.PP
\fBParameters\fP
.RS 4
\fId\fP The number to stringify
.br
\fIwidth\fP The reserved width of the string
.br
\fIprec\fP The precision of the stringified number
.RE
.PP
\fBReturns\fP
.RS 4
std::string
.RE
.PP
.PP
Definition at line \fB17\fP of file \fButils\&.cpp\fP\&.
.SH "Author"
.PP
Generated automatically by Doxygen for Penning Trap Simulation from the source code\&.

View File

@ -53,8 +53,8 @@ vec_3d PenningTrap::v_func(unsigned int i, unsigned int j, double dt)
case 2: case 2:
return dt * this->k_v[2][j]; return dt * this->k_v[2][j];
case 3: case 3:
return (dt / 6.) * (this->k_v[0][j].eval() + this->k_v[1][j].eval() + return (dt / 6.) * (this->k_v[0][j] + this->k_v[1][j] +
this->k_v[2][j].eval() + this->k_v[3][j].eval()); this->k_v[2][j] + this->k_v[3][j]);
default: default:
std::cout << "Not valid!" << std::endl; std::cout << "Not valid!" << std::endl;
abort(); abort();
@ -71,8 +71,8 @@ vec_3d PenningTrap::r_func(unsigned int i, unsigned int j, double dt)
case 2: case 2:
return dt * this->k_r[2][j]; return dt * this->k_r[2][j];
case 3: case 3:
return (dt / 6.) * (this->k_r[0][j].eval() + this->k_r[1][j].eval() + return (dt / 6.) * (this->k_r[0][j] + this->k_r[1][j] +
this->k_r[2][j].eval() + this->k_r[3][j].eval()); this->k_r[2][j] + this->k_r[3][j]);
default: default:
std::cout << "Not valid!" << std::endl; std::cout << "Not valid!" << std::endl;
abort(); abort();
@ -212,12 +212,16 @@ void PenningTrap::evolve_forward_euler(double dt, bool particle_interaction)
this->t += dt; this->t += dt;
} }
sim_arr PenningTrap::simulate(double time, unsigned int steps, simulation_t PenningTrap::simulate(double time, unsigned int steps,
std::string method, bool particle_interaction) std::string method,
bool particle_interaction)
{ {
double dt = time / (double)steps; double dt = time / (double)steps;
sim_arr res(this->particles.size(), sim_cols(steps)); unsigned int size = this->particles.size();
// sim_arr res(this->particles.size(), sim_cols(steps));
simulation_t res{sim_arr(size, sim_cols(steps)),
sim_arr(size, sim_cols(steps))};
void (PenningTrap::*func)(double, bool); void (PenningTrap::*func)(double, bool);
if (method == "rk4") { if (method == "rk4") {
@ -232,8 +236,9 @@ sim_arr PenningTrap::simulate(double time, unsigned int steps,
} }
for (size_t j = 0; j < steps; j++) { for (size_t j = 0; j < steps; j++) {
for (size_t i = 0; i < this->particles.size(); i++) { for (size_t i = 0; i < size; i++) {
res[i][j] = this->particles[i].r_vec; res.r_vecs[i][j] = this->particles[i].r_vec;
res.v_vecs[i][j] = this->particles[i].v_vec;
} }
(this->*func)(dt, particle_interaction); (this->*func)(dt, particle_interaction);
} }
@ -242,7 +247,8 @@ sim_arr PenningTrap::simulate(double time, unsigned int steps,
} }
void PenningTrap::write_simulation_to_dir(std::string path, double time, void PenningTrap::write_simulation_to_dir(std::string path, double time,
unsigned int steps, std::string method, unsigned int steps,
std::string method,
bool particle_interaction) bool particle_interaction)
{ {
if (path.back() != '/') { if (path.back() != '/') {
@ -253,23 +259,34 @@ void PenningTrap::write_simulation_to_dir(std::string path, double time,
return; return;
} }
sim_arr res = this->simulate(time, steps, method, particle_interaction); simulation_t res =
this->simulate(time, steps, method, particle_interaction);
std::ofstream ofile; std::ofstream ofile;
#pragma omp parallel for private(ofile) #pragma omp parallel for private(ofile)
for (size_t i = 0; i < this->particles.size(); i++) { for (size_t i = 0; i < this->particles.size(); i++) {
ofile.open(path + "particle_" + std::to_string(i) + ".txt"); ofile.open(path + "particle_" + std::to_string(i) + "_r.txt");
for (vec_3d &vec : res[i]) { for (vec_3d &vec : res.r_vecs[i]) {
ofile << vec(0) << "," << vec(1) << "," << vec(2) << "\n"; ofile << vec(0) << "," << vec(1) << "," << vec(2) << "\n";
} }
ofile.close(); ofile.close();
ofile.open(path + "particle_" + std::to_string(i) + "_v.txt");
for (vec_3d &vec : res.v_vecs[i]) {
ofile << scientific_format(vec(0), 10, 8) << ","
<< scientific_format(vec(1), 8, 10) << ","
<< scientific_format(vec(2), 8, 10) << "\n";
}
ofile.close();
} }
} }
double PenningTrap::fraction_of_particles_left(double time, unsigned int steps, std::string method, bool particle_interaction) double PenningTrap::fraction_of_particles_left(double time, unsigned int steps,
std::string method,
bool particle_interaction)
{ {
sim_arr res = this->simulate(time, steps, method, particle_interaction); simulation_t res =
this->simulate(time, steps, method, particle_interaction);
int particles_left = 0; int particles_left = 0;
@ -281,4 +298,3 @@ double PenningTrap::fraction_of_particles_left(double time, unsigned int steps,
return (double)particles_left / (double)this->particles.size(); return (double)particles_left / (double)this->particles.size();
} }

View File

@ -12,6 +12,7 @@
#include <cmath> #include <cmath>
#include <fstream> #include <fstream>
#include <functional>
#include <omp.h> #include <omp.h>
#include <string> #include <string>
#include <sys/stat.h> #include <sys/stat.h>
@ -21,7 +22,7 @@
#include "utils.hpp" #include "utils.hpp"
#define PARTICLES 100 #define PARTICLES 100
#define N 10000 #define N 40000
#define CHARGE 1. #define CHARGE 1.
#define MASS 40. // unit: amu #define MASS 40. // unit: amu
@ -36,7 +37,7 @@ void simulate_single_particle()
double time = 50.; // microseconds double time = 50.; // microseconds
DEBUG("Write to dir"); DEBUG("Write to dir");
trap.write_simulation_to_dir("output/simulate_single_particle", time, N); trap.write_simulation_to_dir("output/simulate_single_particle", time, N, "rk4", false);
} }
void simulate_two_particles() void simulate_two_particles()
@ -78,8 +79,7 @@ void simulate_100_particles()
{ {
PenningTrap trap((unsigned)100, T, PenningTrap trap((unsigned)100, T,
[](double t) { [](double t) {
return 25. * V / 1000. * return 25. * V / 1000. * (1. + .4 * std::cos(1.5 * t));
(1. + .4 * std::cos(1.5 * t));
}, },
500., 0); 500., 0);
@ -97,50 +97,61 @@ void simulate_100_particles_with_time_potential()
double freq_increment = .02; double freq_increment = .02;
size_t freq_iterations = (size_t)((freq_end - freq_start) / freq_increment); size_t freq_iterations = (size_t)((freq_end - freq_start) / freq_increment);
double res[4][freq_iterations];
std::string path = "output/time_dependent_potential/"; std::string path = "output/time_dependent_potential/";
mkpath(path); mkpath(path);
std::ofstream ofile; std::ofstream ofile;
for (double f : amplitudes) { double freq = freq_start;
ofile.open(path + "f_" + std::to_string(f) + ".txt");
#pragma omp parallel for ordered schedule(static, 1)
for (size_t i=0; i<freq_iterations; i++) { for (size_t i=0; i<freq_iterations; i++) {
double freq = freq_start + i*freq_increment; res[0][i] = freq;
freq += freq_increment;
}
#pragma omp parallel for collapse(2) num_threads(4)
for (size_t i = 0; i < 3; i++) {
for (size_t j = 0; j < freq_iterations; j++) {
PenningTrap trap((unsigned)100, T, PenningTrap trap((unsigned)100, T,
[f, freq](double t) { std::bind([](double f, double r, double t) {
return (25. * V / 1000.) * return (25. * V / 1000.) *
(1. + f * std::cos(freq * t)); (1. +
}, f * std::cos(r * t));
}, amplitudes[i], res[0][j], std::placeholders::_1),
500., 0.); 500., 0.);
double res = trap.fraction_of_particles_left(500., 40000, "rk4", true); res[i + 1][j] =
#pragma omp ordered trap.fraction_of_particles_left(500., 40000, "rk4", false);
ofile << freq << "," << res << "\n"; }
}
ofile.open(path + "res.txt");
for (size_t i=0; i<freq_iterations; i++) {
ofile << res[0][i] << ","
<< res[1][i] << ","
<< res[2][i] << ","
<< res[3][i] << "\n";
} }
ofile.close(); ofile.close();
} }
}
int main() int main()
{ {
double start = omp_get_wtime();
simulate_single_particle(); simulate_single_particle();
simulate_two_particles(); simulate_two_particles();
simulate_single_particle_with_different_steps(); //simulate_single_particle_with_different_steps();
double start = omp_get_wtime(); //simulate_100_particles();
for (int i=0; i<5; i++) {
simulate_100_particles();
}
//simulate_100_particles_with_time_potential(); //simulate_100_particles_with_time_potential();
double end = omp_get_wtime(); double end = omp_get_wtime();
std::cout << "Average time: " << (end - start) / 5. << " seconds" << std::endl; std::cout << "Time: " << (end - start) << " seconds" << std::endl;
return 0; return 0;
} }

View File

@ -1,33 +0,0 @@
import matplotlib.pyplot as plt
def main():
files = [
"output/time_dependent_potential/f_0.100000.txt",
"output/time_dependent_potential/f_0.400000.txt",
"output/time_dependent_potential/f_0.700000.txt",
]
vals = [
.1,
.4,
.7
]
for i in range(3):
with open(files[i]) as f:
lines = f.readlines()
x = []
y = []
for line in lines:
a,b = line.strip().split(",")
x.append(float(a))
y.append(float(b))
plt.plot(x,y,label=f"amplitude: {vals[i]}")
plt.xlabel(r"$\omega_V$")
plt.ylabel(r"Fraction of particles left")
plt.title(r"The fraction of particles left in the Penning trap "
"after 500 microseconds for different amplitudes and frequencies")
plt.legend()
plt.show()
if __name__ == "__main__":
main()

View File

@ -0,0 +1,30 @@
import matplotlib.pyplot as plt
def main():
with open("output/time_dependent_potential/res.txt") as f:
lines = f.readlines()
x = []
y1 = []
y2 = []
y3 = []
for line in lines:
l = line.strip().split(",")
x.append(float(l[0]))
y1.append(float(l[1]))
y2.append(float(l[2]))
y3.append(float(l[3]))
plt.plot(x,y1,label=f"amplitude: 0.1")
plt.plot(x,y2,label=f"amplitude: 0.4")
plt.plot(x,y3,label=f"amplitude: 0.7")
plt.xlabel(r"$\omega_V$ (MHz)")
plt.ylabel(r"Fraction of particles left")
plt.title(r"The fraction of particles left in the Penning trap "
"after 500 microseconds for different amplitudes and frequencies")
plt.legend()
# plt.show()
plt.savefig("../latex/images/particles_left.pdf")
if __name__ == "__main__":
main()

View File

@ -0,0 +1,29 @@
import matplotlib.pyplot as plt
import numpy as np
def z(t):
V_0 = 25.*9.64852558 * 10**4
m = 40.
d = 500.
w_z = np.sqrt((2.*V_0)/(m*d*d))
return 20.*np.cos(w_z*t)
def main():
filename = "output/simulate_single_particle/particle_0_r.txt"
r = t = []
with open(filename) as f:
lines = f.readlines()
t = np.linspace(0, 50, len(lines))
r = np.array([list(map(float, line.strip().split(","))) for line in lines])
plt.plot(t, r[:, 2], label="approximation")
plt.plot(t, z(t), label="analytical")
plt.xlabel(r"time $(\mu s)$")
plt.ylabel(r"z $(\mu m)$")
plt.title(r"Movement of a single particle in the x direction")
plt.legend()
plt.savefig("../latex/images/single_particle.pdf")
if __name__ == "__main__":
main()