diff --git a/include/scalfmm/tree/leaf.hpp b/include/scalfmm/tree/leaf.hpp deleted file mode 100644 index 9508cc43c3fe2a4c682ee9e2cd05dd4ebe6437e7..0000000000000000000000000000000000000000 --- a/include/scalfmm/tree/leaf.hpp +++ /dev/null @@ -1,620 +0,0 @@ -// -------------------------------- -// See LICENCE file at project root -// File : scalfmm/tree/leaf.hpp -// -------------------------------- -#ifndef SCALFMM_TREE_LEAF_HPP -#define SCALFMM_TREE_LEAF_HPP - -#warning("Do not use this file - old leaf format") - -#include "scalfmm/container/particle_container.hpp" -#include "scalfmm/container/point.hpp" -#include "scalfmm/container/variadic_adaptor.hpp" -#include "scalfmm/meta/traits.hpp" -#include "scalfmm/meta/type_pack.hpp" -#include "scalfmm/meta/utils.hpp" -#include "scalfmm/tags/tags.hpp" -#include "scalfmm/tree/group.hpp" -#include "scalfmm/tree/header.hpp" -#include "scalfmm/tree/utils.hpp" -#include "scalfmm/utils/massert.hpp" -#include "scalfmm/utils/math.hpp" - -#include <algorithm> -#include <any> -#include <array> -#include <cmath> -#include <cstddef> -#include <iterator> -#include <tuple> -#include <type_traits> -#include <utility> -#include <vector> - -namespace scalfmm::component -{ - - /** - * @brief This is the leaf type stored at the bottom of the tree. - * Its stores the particle container and some symbolics informations. - * - * @tparam Particle : the type of particle to store. - * @tparam D - */ - template<typename Particle, typename D = void> - class leaf - { - public: - /** - * @brief Static dimension of the space. - * - */ - static constexpr std::size_t dimension = Particle::dimension; - // self type - using self_type = leaf<Particle>; - // Symbolic types : the type storing informations about the leaf component - using symbolics_type = symbolics_data<std::conditional_t<std::is_void_v<D>, self_type, D>>; - // the particle type stored in the container - using particle_type = Particle; - using proxy_type = typename Particle::proxy_type; - using const_proxy_type = typename Particle::const_proxy_type; - // the position type extract from the symbolic information - using position_type = typename Particle::position_type; - // symbolics_type::position_type; - // the position value type - using value_type = typename position_type::value_type; - // the particle container type - using particle_container_type = container::particle_container<particle_type>; - - // rule of five generated by the compiler - - /** - * @brief Construct a new leaf object - * - */ - leaf() = default; - - /** - * @brief Construct a new leaf object - * - */ - leaf(leaf const&) = default; - - /** - * @brief Construct a new leaf object - * - */ - leaf(leaf&&) noexcept = default; - - /** - * @brief - * - * @return leaf& - */ - inline auto operator=(leaf const&) -> leaf& = default; - - /** - * @brief - * - * @return leaf& - */ - inline auto operator=(leaf&&) noexcept -> leaf& = default; - - /** - * @brief Destroy the leaf object - * - */ - ~leaf() = default; - - /** - * @brief Constructors from center and width - * - * @param center : the center of the leaf - * @param width : the width of the leaf - */ - leaf(position_type const& center, value_type width) - : m_center(center) - , m_width(width) - { - } - - /** - * @brief Constructors from number of particles, center, width and a morton index - * - * @param nb_particles : number of particles in the container - * @param center : the center of the leaf - * @param width : the width of the leaf - * @param morton_index : the morton index of the leaf - */ - leaf(std::size_t nb_particles, position_type const& center, value_type width, std::size_t morton_index) - : m_particles(nb_particles) - , m_symbolics{morton_index} - , m_nb_particles(nb_particles) - , m_center(center) - , m_width(width) - { - m_symbolics.morton_index = morton_index; - } - - /** - * @brief Construct a new leaf object - * Constructors from a container of particles, center, width and a morton index - * It takes an rvalue reference to the container allowing you to move the container inside the leaf. - * - * @param container : rvalue ref to the container - * @param nb_particles : number of particles - * @param center : the center of the leaf - * @param width : the width of the leaf - * @param morton_index : the morton index of the leaf - */ - leaf(particle_container_type&& container, std::size_t nb_particles, position_type const& center, - value_type width, std::size_t morton_index) - : m_particles(container) - , m_symbolics{morton_index} - , m_nb_particles(nb_particles) - , m_center(center) - , m_width(width) - { - } - - /** - * @brief Constructors from a container of particles with iterators, center, width and a morton index - * - * @param begin : iterator on the begin of the particle container to copy - * @param end : iterator on the end of the particle container to copy - * @param nb_particles : number of particles - * @param center : the center of the leaf - * @param width : the width of the leaf - * @param morton_index : the morton index of the leaf - */ - leaf(typename particle_container_type::const_iterator begin, - typename particle_container_type::const_iterator end, std::size_t nb_particles, - position_type const& center, value_type width, std::size_t morton_index) - : m_particles(nb_particles) - , m_symbolics{morton_index} - , m_nb_particles(nb_particles) - , m_center(center) - , m_width(width) - { - std::copy(begin, end, std::begin(m_particles)); - } - - /** - * @brief Returns the center of the leaf. - * - * @return position_type const& - */ - [[nodiscard]] inline auto center() const noexcept -> position_type const& { return m_center; } - - /** - * @brief Returns the width of the leaf. - * - * @return value_type - */ - [[nodiscard]] inline auto width() const noexcept -> value_type { return m_width; } - - /** - * @brief Returns the number of particles - * - * @return std::size_t - */ - [[nodiscard]] inline auto size() const noexcept -> std::size_t { return m_nb_particles; } - - /** - * @brief Non-const accessor on the container - * - * @return particle_container_type& - */ - [[nodiscard]] inline auto particles() -> particle_container_type& { return m_particles; } - - /** - * @brief Const accessor on the container. - * - * @return particle_container_type const& - */ - [[nodiscard]] inline auto particles() const -> particle_container_type const& { return m_particles; } - - /** - * @brief Const accessor on the container. - * - * @return particle_container_type const& - */ - [[nodiscard]] inline auto cparticles() const -> particle_container_type const& { return m_particles; } - - /** - * @brief Indexed accessor on the particle container. - * - * @param i the index at which the access is performed. - * @return particle_type& - */ - [[nodiscard]] inline auto particles(std::size_t i) -> particle_type& { return m_particles.at(i); } - - /** - * @brief Indexed accessor on the particle container. - * - * @param i the index at which the access is performed. - * @return particle_type& - */ - [[nodiscard]] inline auto particle(std::size_t i) -> particle_type& { return m_particles.at(i); } - - /** - * @brief Indexed accessor on the particle container. - * - * @param i the index at which the access is performed. - * @return particle_type const& - */ - [[nodiscard]] inline auto particles(std::size_t i) const -> particle_type const& { return m_particles.at(i); } - - /** - * @brief Indexed accessor on the particle container. - * - * @param i the index at which the access is performed. - * @return particle_type const& - */ - [[nodiscard]] inline auto particle(std::size_t i) const -> particle_type const& { return m_particles.at(i); } - - /** - * @brief - * - * @return particle_container_type::iterator - */ - [[nodiscard]] inline auto begin() -> typename particle_container_type::iterator { return m_particles.begin(); } - - /** - * @brief - * - * @return particle_container_type::const_iterator - */ - [[nodiscard]] inline auto begin() const -> typename particle_container_type::const_iterator - { - return m_particles.begin(); - } - - /** - * @brief - * - * @return particle_container_type::const_iterator - */ - [[nodiscard]] inline auto cbegin() const -> typename particle_container_type::const_iterator - { - return m_particles.cbegin(); - } - - /** - * @brief - * - * @return particle_container_type::iterator - */ - [[nodiscard]] inline auto end() -> typename particle_container_type::iterator { return m_particles.end(); } - - /** - * @brief - * - * @return particle_container_type::const_iterator - */ - [[nodiscard]] inline auto end() const -> typename particle_container_type::const_iterator - { - return m_particles.end(); - } - - /** - * @brief - * - * @return particle_container_type::const_iterator - */ - [[nodiscard]] inline auto cend() const -> typename particle_container_type::const_iterator - { - return m_particles.cend(); - } - - /** - * @brief Access to the symbolic type. - * - * @return symbolics_type& - */ - [[nodiscard]] inline auto symbolics() -> symbolics_type& { return m_symbolics; } - - /** - * @brief Access to the symbolic type. - * - * @return symbolics_type const& - */ - [[nodiscard]] inline auto symbolics() const -> symbolics_type const& { return m_symbolics; } - - /** - * @brief Access to the symbolic type. - * - * @return symbolics_type const& - */ - [[nodiscard]] inline auto csymbolics() const -> symbolics_type const& { return m_symbolics; } - - /** - * @brief Returns the morton index of the leaf. - * - * @return std::size_t - */ - [[nodiscard]] inline auto index() const noexcept -> std::size_t { return m_symbolics.morton_index; } - - /** - * @brief Insert a particle at the index. - * - * @param part the particle to insert. - * @param index the position to insert the particle. - */ - inline auto insert_particle(particle_type const& part, std::size_t index) -> void - { - assertm(index < m_nb_particles, "Inserting particle out of range in leaf."); - auto it = std::begin(m_particles) + index; - *it = part.as_tuple(); - } - - /** - * @brief Insert a particle at the index. - * - * @tparam Types - * @param part the tuple corresponding to the particle to insert. - * @param index the position to insert the particle. - */ - template<typename... Types> - inline auto insert_particle(std::tuple<Types...> const& part, std::size_t index) -> void - { - assertm(index < m_nb_particles, "Inserting particle out of range in leaf."); - auto it = std::begin(m_particles); - std::advance(it, index); - *it = part; - } - - /** - * @brief Resets the positions of the leaves. - * - */ - inline auto reset_positions() -> void { m_particles.reset_positions(); } - - /** - * @brief Resets the inputs of the leaves. - * - */ - inline auto reset_inputs() -> void { m_particles.reset_inputs(); } - - /** - * @brief Resets the outputs of the leaves. - * - */ - inline auto reset_outputs() -> void { m_particles.reset_outputs(); } - - /** - * @brief Resets the variables of the leaves. - * - */ - inline auto reset_variables() -> void { m_particles.reset_variables(); } - - /** - * @brief Resets the particles of the leaves. - * - */ - inline auto reset_particles() -> void { m_particles.reset_particles(); } - - private: - /** - * @brief The particle container. - * - */ - particle_container_type m_particles{}; - - /** - * @brief The symbolic data. - * - */ - symbolics_type m_symbolics{}; - - /** - * @brief The number of particles. - * - */ - std::size_t m_nb_particles{}; - - /** - * @brief Position of the center. - * - */ - position_type m_center{}; - - /** - * @brief The width of the leaf. - * - */ - value_type m_width{}; - }; - - /** - * @brief The symbolics type stores information about the leaf - * It represents a generic that also exists on the cells - * - * @tparam P - */ - template<typename P> - struct symbolics_data<leaf<P>> - { - // the leaf type - using component_type = leaf<P>; - // the group type - using group_type = group<component_type>; - // the position type - using position_type = - typename component_type::particle_type::position_type; // container::point<position_value_type, - // P::dimension>; - // the coordinate type to store the coordinate in the tree - using coordinate_type = - decltype(index::get_coordinate_from_morton_index<position_type::dimension>(std::size_t{})); - // - // the number of interactions of the leaf - static constexpr std::size_t number_of_interactions{int(math::pow(3, position_type::dimension))}; - // type of the array storing the indexes of the theoretical interaction list - using interaction_index_array_type = std::array<std::size_t, number_of_interactions>; - // type of the array storing the iterators of the interacting leaves available in the current group - using iterator_array_type = std::array<typename group_type::iterator_type, number_of_interactions>; - using iterator_type = typename iterator_array_type::value_type; - - /** - * @brief The morton index of the leaf. - * - */ - std::size_t morton_index{0}; - - /** - * @brief The array storing the indices of the theoritical interaction list. - * - */ - interaction_index_array_type interaction_indexes{}; - - /** - * @brief The array storing the iterators of the interacting leaves available in the current group. - * - */ - iterator_array_type interaction_iterators{}; - - /** - * @brief The theoritical number of neighbors of the number of morton indices available (in the mutual algorithm). - * - */ - std::size_t number_of_neighbors{0}; - - /** - * @brief The number of morton indices available in the group of the leaf. - * - */ - std::size_t existing_neighbors_in_group{0}; - - /** - * @brief - * - * @param counter - * @param idx - * @param leaf_iter - */ - inline auto set(int counter, std::size_t const& idx, const iterator_type& leaf_iter) -> void - { - interaction_iterators.at(counter) = leaf_iter; - } - - /** - * @brief - * - * @param done - * @param counter_existing_component - */ - inline auto finalize(bool done, std::size_t const& counter_existing_component) -> void - { - number_of_neighbors = counter_existing_component; - } - }; - - /** - * @brief The symbolics type that stores information about the group of leaves. - * - * @tparam P - */ - template<typename P> - struct symbolics_data<group<leaf<P>>> - { - // the leaf type - using component_type = leaf<P>; - // the group type - using group_type = group<leaf<P>>; - // the particle type is also P - using particle_type = typename component_type::particle_type; - using particle_container_type = container::particle_container<particle_type>; - - using iterator_type = typename group_type::iterator_type; - using seq_iterator_type = - std::conditional_t<meta::exist_v<meta::inject<group_type>>, meta::exist_t<meta::inject<group_type>>, - std::tuple<typename group_type::iterator_type, group_type>>; - using iterator_source_type = std::tuple_element_t<0, seq_iterator_type>; - // using iterator_array_type = std::array<iterator_source_type, number_of_interactions>; - using out_of_block_interaction_type = out_of_block_interaction<iterator_type, std::size_t>; - - /** - * @brief The starting morton index in the group. - * - */ - std::size_t starting_index{0}; - - /** - * @brief The ending morton index in the group. - * - */ - std::size_t ending_index{0}; - - /** - * @brief The number of leaves in the group. - * - */ - std::size_t number_of_component_in_group{0}; - - /** - * @brief The number of particles in the group. - * - */ - std::size_t number_of_particles_in_group{0}; - - /** - * @brief The index of the group. - * - */ - std::size_t idx_global{0}; - - /** - * @brief - * - */ - bool is_mine{false}; - - /** - * @brief Vector storing the out_of_block_interaction structure to handle the outside interactions. - * - */ - std::vector<out_of_block_interaction_type> outside_interactions{}; - - /** - * @brief Flag if the vector is constructed. - * - */ - bool outside_interactions_exists{false}; - - /** - * @brief Flag if the vector is sorted. - * - */ - bool outside_interactions_sorted{false}; -#if _OPENMP - /** - * @brief the dependencies are set on the pointer on the leaf group (same as particle container). - * - */ - std::vector<group_type*> group_dependencies{}; -#endif - - /** - * @brief Construct a new symbolics data object - * - * @param starting_morton_idx - * @param ending_morton_idx - * @param number_of_component - * @param in_index_global - * @param in_is_mine - */ - symbolics_data(size_t starting_morton_idx, size_t ending_morton_idx, size_t number_of_component, - size_t in_index_global, bool in_is_mine) - : starting_index(starting_morton_idx) - , ending_index(ending_morton_idx) - , number_of_component_in_group(number_of_component) - , number_of_particles_in_group(0) - , idx_global(in_index_global) - , is_mine(in_is_mine) - { - } - }; - -} // namespace scalfmm::component - -#endif // SCALFMM_TREE_TREE_HPP