Implement RK4 method

This commit is contained in:
Cory Balaton 2023-10-08 00:35:52 +02:00
parent aef5c4ee45
commit b5acec572f
No known key found for this signature in database
GPG Key ID: 3E5FCEBFD80F432B

View File

@ -103,6 +103,65 @@ arma::vec PenningTrap::total_force(int i)
void PenningTrap::evolve_RK4(double dt) void PenningTrap::evolve_RK4(double dt)
{ {
std::vector<Particle> tmp_particles = this->particles;
arma::vec::fixed<3> *k_v = new arma::vec::fixed<3>[this->particles.size()*4];
arma::vec::fixed<3> *k_r = new arma::vec::fixed<3>[this->particles.size()*4];
int size = this->particles.size();
for (int i=0; i<size; i++) {
k_v[i] = this->total_force(i)/this->particles.at(i).m;
k_r[i] = this->particles.at(i).v_vec;
}
for (int i=0; i<size; i++) {
Particle *p = &this->particles.at(i);
p->v_vec = tmp_particles.at(i).v_vec + (dt/2)*k_v[i];
p->r_vec = tmp_particles.at(i).r_vec + (dt/2)*k_r[i];
}
for (int i=0; i<size; i++) {
k_v[1*size + i] = this->total_force(i)/this->particles.at(i).m;
k_r[1*size + i] = this->particles.at(i).v_vec;
}
for (int i=0; i<size; i++) {
Particle *p = &this->particles.at(i);
p->v_vec = tmp_particles.at(i).v_vec + (dt/2)*k_v[1*size + i];
p->r_vec = tmp_particles.at(i).r_vec + (dt/2)*k_r[1*size + i];
}
for (int i=0; i<size; i++) {
k_v[2*size + i] = this->total_force(i)/this->particles.at(i).m;
k_r[2*size + i] = this->particles.at(i).v_vec;
}
for (int i=0; i<size; i++) {
Particle *p = &this->particles.at(i);
p->v_vec = tmp_particles.at(i).v_vec + dt*k_v[2*size + i];
p->r_vec = tmp_particles.at(i).r_vec + dt*k_r[2*size + i];
}
for (int i=0; i<size; i++) {
k_v[3*size + i] = this->total_force(i)/this->particles.at(i).m;
k_r[3*size + i] = this->particles.at(i).v_vec;
}
for (int i=0; i<size; i++) {
Particle *p = &this->particles.at(i);
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;
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;
}
delete [] k_v;
delete [] k_r;
} }
void PenningTrap::evolve_forward_euler(double dt) void PenningTrap::evolve_forward_euler(double dt)