From 743fce5342f8f2e24196db9594351bed576c3b51 Mon Sep 17 00:00:00 2001 From: Bruno Blais Date: Tue, 4 Jul 2023 12:43:34 -0400 Subject: [PATCH] Modify performance test to use FEPointEvaluator --- examples/step-68/step-68.cc | 2 - tests/performance/timing_step_68.cc | 57 ++++++++++++++--------------- 2 files changed, 28 insertions(+), 31 deletions(-) diff --git a/examples/step-68/step-68.cc b/examples/step-68/step-68.cc index 9e23985f3c..dc70cc20f1 100644 --- a/examples/step-68/step-68.cc +++ b/examples/step-68/step-68.cc @@ -543,8 +543,6 @@ namespace Step68 Vector local_dof_values(fluid_fe.dofs_per_cell); FEPointEvaluation evaluator(mapping, fluid_fe, update_values); - const FEValuesExtractors::Vector velocity(0); - // We loop over all the local particles. Although this could be achieved // directly by looping over all the cells, this would force us diff --git a/tests/performance/timing_step_68.cc b/tests/performance/timing_step_68.cc index 03f7b0a519..5a0fff6dcc 100644 --- a/tests/performance/timing_step_68.cc +++ b/tests/performance/timing_step_68.cc @@ -320,13 +320,13 @@ namespace Step68 velocity_field.update_ghost_values(); } - template - void - ParticleTracking::euler_step_interpolated(const double dt) + void ParticleTracking::euler_step_interpolated(const double dt) { Vector local_dof_values(fluid_fe.dofs_per_cell); + FEPointEvaluation evaluator(mapping, fluid_fe, update_values); + auto particle = particle_handler.begin(); while (particle != particle_handler.end()) { @@ -338,38 +338,37 @@ namespace Step68 const auto pic = particle_handler.particles_in_cell(cell); Assert(pic.begin() == particle, ExcInternalError()); + std::vector> particle_positions; for (auto &p : pic) - { - const Point reference_location = p.get_reference_location(); - Tensor<1, dim> particle_velocity; - for (unsigned int j = 0; j < fluid_fe.dofs_per_cell; ++j) - { - const auto comp_j = fluid_fe.system_to_component_index(j); - - particle_velocity[comp_j.first] += - fluid_fe.shape_value(j, reference_location) * - local_dof_values[j]; - } - - Point particle_location = particle->get_location(); - for (int d = 0; d < dim; ++d) - particle_location[d] += particle_velocity[d] * dt; - p.set_location(particle_location); - - ArrayView properties = p.get_properties(); - for (int d = 0; d < dim; ++d) - properties[d] = particle_velocity[d]; - - properties[dim] = - Utilities::MPI::this_mpi_process(mpi_communicator); - - ++particle; - } + particle_positions.push_back(p.get_reference_location()); + + evaluator.reinit(cell, particle_positions); + evaluator.evaluate(make_array_view(local_dof_values), + EvaluationFlags::values); + + for (unsigned int particle_index = 0; + particle != pic.end(); + ++particle, ++particle_index) + { + Point particle_location = particle->get_location(); + const Tensor<1, dim> &particle_velocity = evaluator.get_value(particle_index) ; + particle_location += particle_velocity*dt; + particle->set_location(particle_location); + + ArrayView properties = particle->get_properties(); + for (int d = 0; d < dim; ++d) + properties[d] = particle_velocity[d]; + + properties[dim] = + Utilities::MPI::this_mpi_process(mpi_communicator); + } } } + + template void ParticleTracking::output_particles() -- 2.39.5