From f138760a223176853d915c095ef8bbe8a1643b29 Mon Sep 17 00:00:00 2001 From: Rene Gassmoeller Date: Thu, 19 Oct 2017 10:01:05 -0600 Subject: [PATCH] Serialization fixes --- source/particles/particle.cc | 43 +++++++-------- tests/particles/particle_04.cc | 84 ++++++++++++++++++++++++++++ tests/particles/particle_04.output | 43 +++++++++++++++ tests/particles/particle_05.cc | 89 ++++++++++++++++++++++++++++++ tests/particles/particle_05.output | 43 +++++++++++++++ 5 files changed, 280 insertions(+), 22 deletions(-) create mode 100644 tests/particles/particle_04.cc create mode 100644 tests/particles/particle_04.output create mode 100644 tests/particles/particle_05.cc create mode 100644 tests/particles/particle_05.output diff --git a/source/particles/particle.cc b/source/particles/particle.cc index 092a3d295a..e06fe14bca 100644 --- a/source/particles/particle.cc +++ b/source/particles/particle.cc @@ -54,18 +54,14 @@ namespace Particles reference_location (particle.get_reference_location()), id (particle.get_id()), property_pool(particle.property_pool), - properties ((property_pool != NULL) ? property_pool->allocate_properties_array() : PropertyPool::invalid_handle) + properties ((particle.has_properties()) ? property_pool->allocate_properties_array() : PropertyPool::invalid_handle) { - if (property_pool != NULL) + if (particle.has_properties()) { const ArrayView my_properties = property_pool->get_properties(properties); + const ArrayView their_properties = particle.get_properties(); - if (my_properties.size() != 0) - { - const ArrayView their_properties = particle.get_properties(); - - std::copy(their_properties.begin(), their_properties.end(), my_properties.begin()); - } + std::copy(their_properties.begin(), their_properties.end(), my_properties.begin()); } } @@ -79,7 +75,7 @@ namespace Particles id = *id_data++; const double *pdata = reinterpret_cast (id_data); - for (unsigned int i = 0; i < dim; ++i) + for (unsigned int i = 0; i < spacedim; ++i) location(i) = *pdata++; for (unsigned int i = 0; i < dim; ++i) @@ -89,9 +85,12 @@ namespace Particles properties = property_pool->allocate_properties_array(); // See if there are properties to load - const ArrayView particle_properties = property_pool->get_properties(properties); - for (unsigned int i = 0; i < particle_properties.size(); ++i) - particle_properties[i] = *pdata++; + if (has_properties()) + { + const ArrayView particle_properties = property_pool->get_properties(properties); + for (unsigned int i = 0; i < particle_properties.size(); ++i) + particle_properties[i] = *pdata++; + } data = static_cast (pdata); } @@ -123,16 +122,13 @@ namespace Particles id = particle.id; property_pool = particle.property_pool; - if (property_pool != NULL) + if (particle.has_properties()) { properties = property_pool->allocate_properties_array(); const ArrayView their_properties = particle.get_properties(); + const ArrayView my_properties = property_pool->get_properties(properties); - if (their_properties.size() != 0) - { - const ArrayView my_properties = property_pool->get_properties(properties); - std::copy(their_properties.begin(), their_properties.end(), my_properties.begin()); - } + std::copy(their_properties.begin(), their_properties.end(), my_properties.begin()); } else properties = PropertyPool::invalid_handle; @@ -179,7 +175,7 @@ namespace Particles double *pdata = reinterpret_cast (id_data); // Write location data - for (unsigned int i = 0; i < dim; ++i,++pdata) + for (unsigned int i = 0; i < spacedim; ++i,++pdata) *pdata = location(i); // Write reference location data @@ -187,9 +183,12 @@ namespace Particles *pdata = reference_location(i); // Write property data - const ArrayView particle_properties = property_pool->get_properties(properties); - for (unsigned int i = 0; i < particle_properties.size(); ++i,++pdata) - *pdata = particle_properties[i]; + if (has_properties()) + { + const ArrayView particle_properties = property_pool->get_properties(properties); + for (unsigned int i = 0; i < particle_properties.size(); ++i,++pdata) + *pdata = particle_properties[i]; + } data = static_cast (pdata); } diff --git a/tests/particles/particle_04.cc b/tests/particles/particle_04.cc new file mode 100644 index 0000000000..f23fce88d4 --- /dev/null +++ b/tests/particles/particle_04.cc @@ -0,0 +1,84 @@ +// --------------------------------------------------------------------- +// +// 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. +// +// --------------------------------------------------------------------- + + + +// Like particle_02, but tests particle serialization and deserialization. + +#include "../tests.h" +#include +#include + + +template +void test () +{ + { + 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; + + const Particles::types::particle_index index(7); + + Particles::Particle particle(position,reference_position,index); + + deallog << "Particle location: " << particle.get_location() << std::endl + << "Particle reference location: " << particle.get_reference_location() << std::endl + << "Particle index: " << particle.get_id() << std::endl; + + std::vector data(particle.serialized_size_in_bytes()); + void *write_pointer = static_cast (&data.front()); + + particle.write_data(write_pointer); + + const void *read_pointer = static_cast (&data.front()); + Particles::PropertyPool pool; + const Particles::Particle new_particle(read_pointer,pool); + + deallog << "Copy particle location: " << new_particle.get_location() << std::endl + << "Copy particle reference location: " << new_particle.get_reference_location() << std::endl + << "Copy particle index: " << new_particle.get_id() << std::endl; + } + + deallog << "OK" << std::endl; +} + + + +int main () +{ + initlog(); + + test<1,1>(); + test<1,2>(); + test<1,3>(); + + test<2,2>(); + test<2,3>(); + + test<3,3>(); + +} diff --git a/tests/particles/particle_04.output b/tests/particles/particle_04.output new file mode 100644 index 0000000000..5d8a3505bc --- /dev/null +++ b/tests/particles/particle_04.output @@ -0,0 +1,43 @@ + +DEAL::Particle location: 0.300000 +DEAL::Particle reference location: 0.200000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 +DEAL::Copy particle reference location: 0.200000 +DEAL::Copy particle index: 7 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 +DEAL::Particle reference location: 0.200000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 0.500000 +DEAL::Copy particle reference location: 0.200000 +DEAL::Copy particle index: 7 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 0.500000 0.700000 +DEAL::Copy particle reference location: 0.200000 +DEAL::Copy particle index: 7 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 +DEAL::Particle reference location: 0.200000 0.400000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 0.500000 +DEAL::Copy particle reference location: 0.200000 0.400000 +DEAL::Copy particle index: 7 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 0.400000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 0.500000 0.700000 +DEAL::Copy particle reference location: 0.200000 0.400000 +DEAL::Copy particle index: 7 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 0.400000 0.600000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 0.500000 0.700000 +DEAL::Copy particle reference location: 0.200000 0.400000 0.600000 +DEAL::Copy particle index: 7 +DEAL::OK diff --git a/tests/particles/particle_05.cc b/tests/particles/particle_05.cc new file mode 100644 index 0000000000..640c14681a --- /dev/null +++ b/tests/particles/particle_05.cc @@ -0,0 +1,89 @@ +// --------------------------------------------------------------------- +// +// 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. +// +// --------------------------------------------------------------------- + + + +// Like particle_02, but tests particle serialization and deserialization using boost archive. + +#include "../tests.h" +#include +#include + +#include +#include + +template +void test () +{ + { + 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; + + const Particles::types::particle_index index(7); + + Particles::Particle particle(position,reference_position,index); + + deallog << "Particle location: " << particle.get_location() << std::endl + << "Particle reference location: " << particle.get_reference_location() << std::endl + << "Particle index: " << particle.get_id() << std::endl; + + std::stringstream stream; + boost::archive::text_oarchive archive(stream); + + archive << particle; + + Particles::Particle new_particle; + + boost::archive::text_iarchive iarchive(stream); + iarchive >> new_particle; + + deallog << "Copy particle location: " << new_particle.get_location() << std::endl + << "Copy particle reference location: " << new_particle.get_reference_location() << std::endl + << "Copy particle index: " << new_particle.get_id() << std::endl; + + + } + + deallog << "OK" << std::endl; +} + + + +int main () +{ + initlog(); + + test<1,1>(); + test<1,2>(); + test<1,3>(); + + test<2,2>(); + test<2,3>(); + + test<3,3>(); + +} diff --git a/tests/particles/particle_05.output b/tests/particles/particle_05.output new file mode 100644 index 0000000000..5d8a3505bc --- /dev/null +++ b/tests/particles/particle_05.output @@ -0,0 +1,43 @@ + +DEAL::Particle location: 0.300000 +DEAL::Particle reference location: 0.200000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 +DEAL::Copy particle reference location: 0.200000 +DEAL::Copy particle index: 7 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 +DEAL::Particle reference location: 0.200000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 0.500000 +DEAL::Copy particle reference location: 0.200000 +DEAL::Copy particle index: 7 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 0.500000 0.700000 +DEAL::Copy particle reference location: 0.200000 +DEAL::Copy particle index: 7 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 +DEAL::Particle reference location: 0.200000 0.400000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 0.500000 +DEAL::Copy particle reference location: 0.200000 0.400000 +DEAL::Copy particle index: 7 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 0.400000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 0.500000 0.700000 +DEAL::Copy particle reference location: 0.200000 0.400000 +DEAL::Copy particle index: 7 +DEAL::OK +DEAL::Particle location: 0.300000 0.500000 0.700000 +DEAL::Particle reference location: 0.200000 0.400000 0.600000 +DEAL::Particle index: 7 +DEAL::Copy particle location: 0.300000 0.500000 0.700000 +DEAL::Copy particle reference location: 0.200000 0.400000 0.600000 +DEAL::Copy particle index: 7 +DEAL::OK -- 2.39.5