From c8a8ac6345996587efa2bed1e50320acbaa9c46f Mon Sep 17 00:00:00 2001 From: Rene Gassmoeller Date: Thu, 2 Nov 2017 17:30:24 -0600 Subject: [PATCH] Add test --- include/deal.II/particles/particle_handler.h | 8 ++ source/particles/particle_handler.cc | 16 +++- tests/particles/particle_handler_01.cc | 8 +- tests/particles/particle_handler_01.output | 2 +- tests/particles/particle_handler_02.cc | 99 ++++++++++++++++++++ tests/particles/particle_handler_02.output | 34 +++++++ 6 files changed, 159 insertions(+), 8 deletions(-) create mode 100644 tests/particles/particle_handler_02.cc create mode 100644 tests/particles/particle_handler_02.output diff --git a/include/deal.II/particles/particle_handler.h b/include/deal.II/particles/particle_handler.h index 271fd2fea4..15df27dce6 100644 --- a/include/deal.II/particles/particle_handler.h +++ b/include/deal.II/particles/particle_handler.h @@ -211,6 +211,14 @@ namespace Particles */ types::particle_index n_global_particles() const; + /** + * Return the maximum number of particles per cell the last + * time the update_n_global_particles() function was called. + * + * @return Maximum number of particles in one cell in simulation. + */ + types::particle_index n_global_max_particles_per_cell() const; + /** * Return the number of particles in the local part of the * triangulation. diff --git a/source/particles/particle_handler.cc b/source/particles/particle_handler.cc index e57a824e8f..53ce6ee87b 100644 --- a/source/particles/particle_handler.cc +++ b/source/particles/particle_handler.cc @@ -111,14 +111,17 @@ namespace Particles types::particle_index locally_highest_index = 0; unsigned int local_max_particles_per_cell = 0; unsigned int current_particles_per_cell = 0; - typename Triangulation::active_cell_iterator current_cell; + typename Triangulation::active_cell_iterator current_cell = triangulation->begin_active(); for (particle_iterator particle = begin(); particle != end(); ++particle) { locally_highest_index = std::max(locally_highest_index,particle->get_id()); if (particle->get_surrounding_cell(*triangulation) != current_cell) - current_particles_per_cell = 0; + { + current_particles_per_cell = 0; + current_cell = particle->get_surrounding_cell(*triangulation); + } ++current_particles_per_cell; local_max_particles_per_cell = std::max(local_max_particles_per_cell, @@ -246,6 +249,15 @@ namespace Particles + template + types::particle_index + ParticleHandler::n_global_max_particles_per_cell() const + { + return global_max_particles_per_cell; + } + + + template types::particle_index ParticleHandler::n_locally_owned_particles() const diff --git a/tests/particles/particle_handler_01.cc b/tests/particles/particle_handler_01.cc index 24557329e5..0bb3d527e4 100644 --- a/tests/particles/particle_handler_01.cc +++ b/tests/particles/particle_handler_01.cc @@ -36,7 +36,6 @@ void test () Particles::ParticleHandler particle_handler(tr,mapping); - Particles::Particle particle; Point position; position(0) = 0.3; @@ -50,10 +49,9 @@ void test () if (dim>1) reference_position(1) = 0.4; if (dim>2) - reference_position(1) = 0.6; + reference_position(2) = 0.6; - particle.set_location(position); - particle.set_reference_location(reference_position); + Particles::Particle particle(position,reference_position,7); deallog << "Particle location: " << particle.get_location() << std::endl; @@ -61,7 +59,7 @@ void test () GridTools::find_active_cell_around_point(mapping, tr, particle.get_location()); particle_handler.insert_particle(particle,cell_position.first); - particle_handler.update_cache(); + particle_handler.update_cached_numbers(); deallog << "Particle number: " << particle_handler.n_global_particles() << std::endl; diff --git a/tests/particles/particle_handler_01.output b/tests/particles/particle_handler_01.output index 2cf7a27522..044ef21d4e 100644 --- a/tests/particles/particle_handler_01.output +++ b/tests/particles/particle_handler_01.output @@ -12,5 +12,5 @@ DEAL::OK DEAL::Particle location: 0.300000 0.500000 0.700000 DEAL::Particle number: 1 DEAL::Particle location: 0.300000 0.500000 0.700000 -DEAL::Particle reference location: 0.200000 0.600000 0.00000 +DEAL::Particle reference location: 0.200000 0.400000 0.600000 DEAL::OK diff --git a/tests/particles/particle_handler_02.cc b/tests/particles/particle_handler_02.cc new file mode 100644 index 0000000000..6d94ddb7de --- /dev/null +++ b/tests/particles/particle_handler_02.cc @@ -0,0 +1,99 @@ +// --------------------------------------------------------------------- +// +// Copyright (C) 2017 by the deal.II authors +// +// This file is part of the deal.II library. +// +// The deal.II library is free software; you can use it, redistribute +// it, and/or modify it under the terms of the GNU Lesser General +// Public License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// The full text of the license can be found in the file LICENSE at +// the top level of the deal.II distribution. +// +// --------------------------------------------------------------------- + + + +// check the creation and destruction of particle within the particle handler class. + +#include "../tests.h" +#include + +#include +#include +#include +#include + +template +void test () +{ + { + parallel::distributed::Triangulation tr(MPI_COMM_WORLD); + + GridGenerator::hyper_cube(tr); + tr.refine_global(1); + MappingQ mapping(1); + + Particles::ParticleHandler particle_handler(tr,mapping); + + + Point position; + position(0) = 0.3; + if (spacedim>1) + position(1) = 0.5; + if (spacedim>2) + position(2) = 0.7; + + Point reference_position; + reference_position(0) = 0.2; + if (dim>1) + reference_position(1) = 0.4; + if (dim>2) + reference_position(2) = 0.6; + + Particles::Particle particle(position,reference_position,7); + deallog << "Particle location: " << particle.get_location() << std::endl; + + + std::pair::active_cell_iterator, Point > cell_position = + GridTools::find_active_cell_around_point(mapping, tr, particle.get_location()); + + particle_handler.insert_particle(particle,cell_position.first); + particle_handler.insert_particle(particle,cell_position.first); + + position(0) = 0.7; + Particles::Particle particle2(position,reference_position,9); + + cell_position = GridTools::find_active_cell_around_point(mapping, tr, particle2.get_location()); + particle_handler.insert_particle(particle2,cell_position.first); + + particle_handler.update_cached_numbers(); + + deallog << "Particle number: " << particle_handler.n_global_particles() << std::endl; + deallog << "Next free particle index: " << particle_handler.get_next_free_particle_index() << std::endl; + deallog << "Max particles per cell: " << particle_handler.n_global_max_particles_per_cell() << std::endl; + + for (auto particle = particle_handler.begin(); particle != particle_handler.end(); ++particle) + { + deallog << "Particle location: " << particle->get_location() << std::endl; + deallog << "Particle reference location: " << particle->get_reference_location() << std::endl; + } + } + + deallog << "OK" << std::endl; +} + + + +int main (int argc, char *argv[]) +{ + Utilities::MPI::MPI_InitFinalize mpi_initialization (argc, argv, 1); + + initlog(); + + test<2,2>(); + test<2,3>(); + + test<3,3>(); +} diff --git a/tests/particles/particle_handler_02.output b/tests/particles/particle_handler_02.output new file mode 100644 index 0000000000..4238f03844 --- /dev/null +++ b/tests/particles/particle_handler_02.output @@ -0,0 +1,34 @@ + +DEAL::Particle location: 0.300000 0.500000 +DEAL::Particle number: 3 +DEAL::Next free particle index: 10 +DEAL::Max particles per cell: 2 +DEAL::Particle location: 0.300000 0.500000 +DEAL::Particle reference location: 0.200000 0.400000 +DEAL::Particle location: 0.300000 0.500000 +DEAL::Particle reference location: 0.200000 0.400000 +DEAL::Particle location: 0.700000 0.500000 +DEAL::Particle reference location: 0.200000 0.400000 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle number: 3 +DEAL::Next free particle index: 10 +DEAL::Max particles per cell: 2 +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 0.400000 +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 0.400000 +DEAL::Particle location: 0.700000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 0.400000 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle number: 3 +DEAL::Next free particle index: 10 +DEAL::Max particles per cell: 2 +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 0.400000 0.600000 +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 0.400000 0.600000 +DEAL::Particle location: 0.700000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 0.400000 0.600000 +DEAL::OK -- 2.39.5