30 #ifndef PARTICLE_SORTING_H 31 #define PARTICLE_SORTING_H 33 #include "base_data_package.h" 46 using tbb::detail::no_assign;
48 using tbb::internal::no_assign;
52 template <
typename RandomAccessIterator,
typename Compare,
typename SwapType>
56 inline size_t median_of_three(
const RandomAccessIterator &array,
size_t l,
size_t m,
size_t r)
const 58 return comp_(array[l], array[m]) ? (comp_(array[m], array[r]) ? m : (comp_(array[l], array[r]) ? r : l))
59 : (comp_(array[r], array[m]) ? m : (comp_(array[r], array[l]) ? r : l));
62 inline size_t PseudoMedianOfNine(
const RandomAccessIterator &array,
const QuickSortParticleRange &range)
const 64 size_t offset = range.size_ / 8u;
65 return median_of_three(array,
66 median_of_three(array, 0, offset, offset * 2),
67 median_of_three(array, offset * 3, offset * 4, offset * 5),
68 median_of_three(array, offset * 6, offset * 7, range.size_ - 1));
73 RandomAccessIterator array = range.begin_;
74 RandomAccessIterator key0 = range.begin_;
75 size_t m = PseudoMedianOfNine(array, range);
77 swap_sortable_particle_data_(array, array + m);
80 size_t j = range.size_;
84 __TBB_ASSERT(i < j,
nullptr);
89 __TBB_ASSERT(i <= j,
"bad ordering relation?");
90 }
while (comp_(*key0, array[j]));
93 __TBB_ASSERT(i <= j,
nullptr);
95 goto quick_sort_particle_partition;
97 }
while (comp_(array[i], *key0));
99 goto quick_sort_particle_partition;
100 swap_sortable_particle_data_(array + i, array + j);
102 quick_sort_particle_partition:
104 swap_sortable_particle_data_(array + j, key0);
109 size_t new_range_size = range.size_ - i;
111 return new_range_size;
115 static const size_t grainsize_ = 500;
116 const Compare &comp_;
117 SwapType &swap_sortable_particle_data_;
119 RandomAccessIterator begin_;
122 size_t size,
const Compare &compare, SwapType &swap_particle_data)
123 : comp_(compare), swap_sortable_particle_data_(swap_particle_data),
124 size_(size), begin_(begin) {}
126 bool empty()
const {
return size_ == 0; }
127 bool is_divisible()
const {
return size_ >= grainsize_; }
130 : comp_(range.comp_), swap_sortable_particle_data_(range.swap_sortable_particle_data_), size_(splitRange(range))
134 begin_(range.begin_ + range.size_ + 1)
144 template <
typename RandomAccessIterator,
typename Compare,
typename SwapType>
145 RandomAccessIterator Partition(RandomAccessIterator first, RandomAccessIterator last, Compare &compare, SwapType &swap_particle_data)
147 auto pivot = std::prev(last, 1);
149 for (
auto j = first; j != pivot; ++j)
152 if (compare(*j, *pivot))
154 swap_particle_data(i++, j);
157 swap_particle_data(i, pivot);
161 template <
typename RandomAccessIterator,
typename Compare,
typename SwapType>
162 void SerialQuickSort(RandomAccessIterator first, RandomAccessIterator last, Compare &compare, SwapType &swap_particle_data)
164 if (std::distance(first, last) > 1)
166 RandomAccessIterator bound = Partition(first, last, compare, swap_particle_data);
167 SerialQuickSort(first, bound, compare, swap_particle_data);
168 SerialQuickSort(bound + 1, last, compare, swap_particle_data);
177 template <
typename RandomAccessIterator,
typename Compare,
typename SwapType>
178 void InsertionSort(RandomAccessIterator First, RandomAccessIterator Last, Compare &compare, SwapType &swap_particle_data)
180 RandomAccessIterator min = First;
181 for (RandomAccessIterator i = First + 1; i < Last; ++i)
182 if (compare(*i, *min))
185 swap_particle_data(First, min);
186 while (++First < Last)
187 for (RandomAccessIterator j = First; compare(*j, *(j - 1)); --j)
188 swap_particle_data((j - 1), j);
192 template <
typename RandomAccessIterator,
typename Compare,
typename SwapType>
197 SerialQuickSort(range.begin_, range.begin_ + range.size_, range.comp_, range.swap_sortable_particle_data_);
209 class BaseCellLinkedList;
211 template <
typename VariableType>
214 void operator()(
ParticleData &particle_data,
size_t index_a,
size_t index_b)
const 218 StdVec<StdLargeVec<VariableType> *> variables = std::get<type_index>(particle_data);
219 for (
size_t i = 0; i != variables.size(); ++i)
221 StdLargeVec<VariableType> &variable = *variables[i];
222 std::swap(variable[index_a], variable[index_b]);
233 bool operator()(
const size_t &x,
const size_t &y)
const 246 StdLargeVec<size_t> &sequence_;
247 StdLargeVec<size_t> &unsorted_id_;
271 quick_sort_particle_range_ptr_keeper_;
283 quick_sort_particle_body_;
297 #endif // PARTICLE_SORTING_H Particles with essential (geometric and kinematic) data. There are three types of particles, all par...
Definition: base_particles.h:81
swap sortable particle data according to a sequence
Definition: particle_sorting.h:243
virtual void sortingParticleData(size_t *begin, size_t size)
Definition: particle_sorting.cpp:34
virtual void updateSortedId()
Definition: particle_sorting.cpp:42
GeneralDataAssemble< StdLargeVec > ParticleData
Definition: sph_data_containers.h:59
Definition: base_data_package.h:46
void operator()(size_t *a, size_t *b)
Definition: particle_sorting.cpp:20
Definition: particle_sorting.h:53
A wrapper to provide an ownership for a new derived object which previous often generated by new a ra...
Definition: ownership.h:90
The class for sorting particle according a given sequence.
Definition: particle_sorting.h:265
Definition: particle_sorting.h:193
SwapSortableParticleData * swap_sortable_particle_data_
Definition: particle_sorting.h:277
This is the base class of SPH particles. The basic data of the particles is saved in separated large ...
Set up of basic data structure.
Definition: particle_sorting.h:38
Definition: base_data_type.h:320
compare the sequence of two particles
Definition: particle_sorting.h:231
Derived body with inner particle configuration or inner interactions. After construction, the particle and material must be specified.
Definition: base_body.h:182
Definition: particle_sorting.h:212
Definition: solid_body_supplementary.cpp:9