2 #include<particle_simulator.hpp>
4 #ifndef ARRAY_ALLOW_LIMIT
5 #define ARRAY_ALLOW_LIMIT 1000000000
11 typedef std::pair<PS::S32, PS::S32> PLinker;
14 PS::ReallocatableArray<PS::S32> group_list_;
15 PS::ReallocatableArray<PS::S32> group_list_disp_;
16 PS::ReallocatableArray<PS::S32> group_list_n_;
27 void searchPartner(PS::ReallocatableArray<PS::S32> & _part_list,
28 PS::ReallocatableArray<PS::S32> & _part_list_disp,
29 PS::ReallocatableArray<PS::S32> & _part_list_n,
33 _part_list.clearSize();
34 _part_list_disp.reserve(_n);
38 _part_list_disp.resizeNoInitialize(_n);
39 _part_list_n.reserve(_n);
40 _part_list_n.resizeNoInitialize(_n);
44 for(
int i=0; i<_n; i++) {
48 _part_list_disp[i] = offset;
49 for(
int j=0; j<_n; j++) {
55 PS::F64 rin_min =
std::min(_ptcl[i].getRGroupCandidate(), _ptcl[j].getRGroupCandidate());
56 if (r2<rin_min*rin_min) {
57 _part_list.push_back(j);
75 std::cerr<<
"Error: zero distance! i="<<i<<
" j="<<j<<std::endl;
108 void mergeGroup(PS::ReallocatableArray<PS::S32> & group_list,
109 PS::ReallocatableArray<PS::S32> & group_list_disp,
110 PS::ReallocatableArray<PS::S32> & group_list_n,
119 PS::ReallocatableArray<PLinker> partner_index;
120 partner_index.reserve(_n_ptcl);
123 PS::ReallocatableArray<PS::S32> reverse_list;
127 reverse_list.reserve(_n_ptcl);
128 reverse_list.resizeNoInitialize(_n_ptcl);
131 assert(group_list.size()==0);
132 assert(group_list_disp.size()==0);
133 assert(group_list_n.size()==0);
136 for(
int i=0; i<_n_ptcl; i++) {
137 if(part_list_n[i]>0) {
138 reverse_list[i] = partner_index.size();
139 partner_index.push_back(PLinker(i,-1));
143 reverse_list[i] = -1;
147 PS::S32 n_tot = partner_index.size();
151 for(
int i=0; i<n_tot; i++) {
153 if(partner_index[i].second>=0)
continue;
155 PS::S32 npart = connectGroups(i,i,part_list, part_list_disp, part_list_n,partner_index,reverse_list);
156 group_list_n.push_back(npart);
160 group_list_disp_.push_back(n_mem);
162 group_list.push_back(partner_index[i].first);
163 PS::S32 inext=partner_index[i].second;
166 group_list.push_back(partner_index[inext].first);
167 inext=partner_index[inext].second;
176 std::cerr<<
"Error: connect group particle number mismatch: npart ="<<npart<<
" ; _n_ptcl = "<<_n_ptcl<<std::endl;
191 PS::ReallocatableArray<PLinker> & partner_index,
192 PS::ReallocatableArray<PS::S32> & reverse_list) {
196 PS::S32 kp = partner_index[ip].first;
197 std::vector<PS::U32> rlist;
198 for(
PS::S32 j=0; j<part_list_n[kp]; j++) {
199 PS::S32 inext = reverse_list[part_list[part_list_disp[kp]+j]];
200 if(partner_index[inext].second<0&&inext!=iend) {
201 if(partner_index[inow].second>=0) n_reduce++;
202 partner_index[inow].second = inext;
203 rlist.push_back(inext);
209 partner_index[inow].second = iend;
213 for(
PS::U32 j=0; j<rlist.size(); j++) {
215 PS::U32 inext = partner_index[inow].second;
216 n_connected += connectGroups(inow,inext,part_list,part_list_disp,part_list_n,partner_index,reverse_list);
218 return n_connected - n_reduce;
225 PS::ReallocatableArray<PS::S32> part_list;
226 PS::ReallocatableArray<PS::S32> part_list_disp;
227 PS::ReallocatableArray<PS::S32> part_list_n;
229 searchPartner(part_list, part_list_disp, part_list_n, _ptcl_in_cluster, _n_ptcl);
230 mergeGroup(group_list_, group_list_disp_, group_list_n_, _n_ptcl, part_list.getPointer(), part_list_disp.getPointer(), part_list_n.getPointer());
234 return group_list_n_.size();
238 return &group_list_[group_list_disp_[igroup]];
242 return group_list_.size();
246 return group_list_n_[igroup];