Small fix

This commit is contained in:
Cory Balaton 2023-10-16 13:33:00 +02:00
parent 0fc1ec1e33
commit 95432102ea
No known key found for this signature in database
GPG Key ID: 3E5FCEBFD80F432B
2 changed files with 19 additions and 13 deletions

View File

@ -178,15 +178,15 @@ void PenningTrap::evolve_RK4(double dt, bool particle_interaction)
p->v_vec = original_particles[j].v_vec + this->v_func(i, j, dt); p->v_vec = original_particles[j].v_vec + this->v_func(i, j, dt);
p->r_vec = original_particles[j].r_vec + this->r_func(i, j, dt); p->r_vec = original_particles[j].r_vec + this->r_func(i, j, dt);
} }
this->particles = tmp_particles; this->particles.swap(tmp_particles);
} }
this->t += dt; this->t += dt;
} }
void PenningTrap::evolve_forward_euler(double dt, bool particle_interaction) void PenningTrap::evolve_forward_euler(double dt, bool particle_interaction)
{ {
std::vector<Particle> new_state = this->particles; size_t size = this->particles.size();
vec_3d force_res[size];
Particle *p; Particle *p;
vec_3d (PenningTrap::*force)(unsigned int); vec_3d (PenningTrap::*force)(unsigned int);
@ -197,14 +197,18 @@ void PenningTrap::evolve_forward_euler(double dt, bool particle_interaction)
force = &PenningTrap::total_force_external; force = &PenningTrap::total_force_external;
} }
#pragma omp parallel for private(p) #pragma omp parallel for
for (size_t i = 0; i < this->particles.size(); i++) { for (size_t i = 0; i < size; i++) {
p = &new_state[i]; force_res[i] = (this->*force)(i);
p->v_vec += dt * (this->*force)(i) / p->m; }
p->r_vec += dt * this->particles[i].v_vec;
#pragma omp parallel for private(p)
for (size_t i = 0; i < size; i++) {
p = &this->particles[i];
p->r_vec += dt * p->v_vec;
p->v_vec += dt * force_res[i] / p->m;
} }
this->particles = new_state;
this->t += dt; this->t += dt;
} }

View File

@ -85,7 +85,7 @@ void simulate_100_particles()
double time = 500.; // microseconds double time = 500.; // microseconds
trap.write_simulation_to_dir("output/simulate_100_particles", time, N*5); trap.write_simulation_to_dir("output/simulate_100_particles", time, N*4);
} }
void simulate_100_particles_with_time_potential() void simulate_100_particles_with_time_potential()
@ -132,13 +132,15 @@ int main()
double start = omp_get_wtime(); 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 << "Time: " << end - start << " seconds" << std::endl; std::cout << "Average time: " << (end - start) / 5. << " seconds" << std::endl;
return 0; return 0;
} }