34 arma::vec::fixed<3> res;
35 double f = this->
V_0 / (this->
d * this->
d);
45 arma::vec::fixed<3> res{0., 0., this->
B_0};
53 arma::vec::fixed<3> res =
57 double norm = arma::norm(res);
60 res *= this->
particles.at(j).q / (norm * norm * norm);
71 arma::vec::fixed<3> v_cross_B{p.
v_vec(1) * B(2) - p.
v_vec(2) * B(1),
86 for (
int j = 0; j < this->
particles.size(); j++) {
94 res *=
K_E * (p.
q / p.
m);
106 std::vector<Particle> tmp_particles = this->
particles;
108 arma::vec::fixed<3> *k_v =
new arma::vec::fixed<3>[this->
particles.size()*4];
109 arma::vec::fixed<3> *k_r =
new arma::vec::fixed<3>[this->
particles.size()*4];
113 for (
int i=0; i<size; i++) {
118 for (
int i=0; i<size; i++) {
121 p->
v_vec = tmp_particles.at(i).v_vec + (dt/2)*k_v[i];
122 p->
r_vec = tmp_particles.at(i).r_vec + (dt/2)*k_r[i];
126 for (
int i=0; i<size; i++) {
128 k_r[1*size + i] = this->
particles.at(i).v_vec;
131 for (
int i=0; i<size; i++) {
134 p->
v_vec = tmp_particles.at(i).v_vec + (dt/2)*k_v[1*size + i];
135 p->
r_vec = tmp_particles.at(i).r_vec + (dt/2)*k_r[1*size + i];
138 for (
int i=0; i<size; i++) {
140 k_r[2*size + i] = this->
particles.at(i).v_vec;
143 for (
int i=0; i<size; i++) {
146 p->
v_vec = tmp_particles.at(i).v_vec + dt*k_v[2*size + i];
147 p->
r_vec = tmp_particles.at(i).r_vec + dt*k_r[2*size + i];
151 for (
int i=0; i<size; i++) {
153 k_r[3*size + i] = this->
particles.at(i).v_vec;
156 for (
int i=0; i<size; i++) {
159 p->
v_vec = tmp_particles.at(i).v_vec + dt*(k_v[i] + k_v[size + i] + k_v[2*size + i] + k_v[3*size + i])/6;
160 p->
r_vec = tmp_particles.at(i).r_vec + dt*(k_r[i] + k_r[size + i] + k_r[2*size + i] + k_r[3*size + i])/6;
169 std::vector<Particle> new_state = this->
particles;
173#pragma omp parallel for private(p)
174 for (
int i = 0; i < this->
particles.size(); i++) {
175 p = &new_state.at(i);
183arma::vec PenningTrap::get_particle(
int i)
188double PenningTrap::get_d()
A class for simulating a Penning trap.
A class that holds attributes of a particle.
arma::vec::fixed< 3 > v_vec
velocity
arma::vec::fixed< 3 > r_vec
position
std::vector< Particle > particles
The particles in the Penning trap.
arma::vec total_force_external(int i)
Calculate the total external force on a particle.
double B_0
Magnetic field strength.
arma::vec total_force_particles(int i)
Calculate the total force on a particle from other particles.
arma::vec external_B_field(arma::vec r)
Calculate B at point r.
arma::vec force_on_particle(int i, int j)
Calculate the force between 2 particles.
void evolve_forward_euler(double dt)
Go forward one timestep using the forward Euler method.
double d
Characteristic dimension.
void add_particle(Particle particle)
Add a particle to the system.
double V_0
Applied potential.
PenningTrap(double B_0=T, double V_0=25.*V/1000., double d=500.)
Set B_0, V_0 and d.
arma::vec total_force(int i)
calculate the total force on a particle.
arma::vec external_E_field(arma::vec r)
Calculate E at point r.
void evolve_RK4(double dt)
Go forward one timestep using the RK4 method.
#define K_E
Coulomb constant. unit: .
Function prototypes and macros that are useful.