47 bool ve_less(CSphvicinity_elm *ve1, CSphvicinity_elm *ve2){
48 return ve1->angle < ve2->angle;
66 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 80 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 83 cosVR = VR2 = tan2R = VR = 0.0;
85 set_particle_list(_particle_list);
94 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 107 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 116 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 127 for (i=0;i<(int) _particle_list.size();i++){
131 plist.push_back(_particle_list[i]);
138 plist[n_part].index = n_part;
141 plist[n_part].ref.randomize();
143 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 144 if (fabs(plist[n_part].eta)>eta_max) eta_max=fabs(plist[n_part].eta);
153 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 160 for (i=0;i<n_part;i++){
161 #ifdef USE_QUADTREE_FOR_STABILITY_TEST 162 quadtree->add(&plist[i]);
164 ve_list[j].v = ve_list[j+1].v = &plist[i];
165 ve_list[j].is_inside = ve_list[j+1].is_inside = &(pincluded[i]);
191 D2_R = 2.0*(1-cos(R));
203 parent_centre = (*parent)/parent->_norm;
204 parent_centre.get_angular_directions(angular_dir1, angular_dir2);
205 angular_dir1 /= angular_dir1._norm;
206 angular_dir2 /= angular_dir2._norm;
209 for (i=0;i<n_part;i++){
210 append_to_vicinity(&plist[i]);
214 sort(vicinity.begin(), vicinity.end(), ve_less);
216 vicinity_size = vicinity.size();
222 inline double sort_angle(
double s,
double c){
223 if (s==0)
return (c>0) ? 0.0 : 2.0;
225 return (s>0) ? 1-t/(1+fabs(t)) : 3-t/(1+fabs(t));
242 double dot = dot_product3(parent_centre,*v);
249 CSph3vector cross = cross_product3(parent_centre,vnormal);
253 double amplT = sqrt((tan2R*(1+dot)+(dot-1))*(1+dot));
257 ve_list[i].centre = median + transverse;
259 ve_list[i].centre/=ve_list[i].centre._norm;
260 CSph3vector diff = ve_list[i].centre - parent_centre;
262 ve_list[i].angle = sort_angle(dot_product3(angular_dir2, diff),dot_product3(angular_dir1, diff));
263 ve_list[i].side =
true;
264 ve_list[i].cocircular.clear();
265 vicinity.push_back(&(ve_list[i]));
268 ve_list[i+1].centre = median - transverse;
270 ve_list[i+1].centre/=ve_list[i+1].centre._norm;
271 diff = ve_list[i+1].centre - parent_centre;
272 ve_list[i+1].angle = sort_angle(dot_product3(angular_dir2, diff),dot_product3(angular_dir1, diff));
273 ve_list[i+1].side =
false;
274 ve_list[i+1].cocircular.clear();
275 vicinity.push_back(&(ve_list[i+1]));
281 CSph3vector OP = parent_centre - ve_list[i+1].centre;
291 double inv_err1 = cross_product3(OP,OC).
_norm * inv_R_EPS_COCIRC;
292 double inv_err2_sq = (D2_R-dot_product3(OP,OC)) * inv_R_2EPS_COCIRC;
293 ve_list[i].cocircular_range = siscone::pow2(inv_err1) > inv_err2_sq ?
295 sqrt(1.0/inv_err2_sq);
296 ve_list[i+1].cocircular_range = ve_list[i].cocircular_range;
CSphvicinity()
default constructor
Implementation of a 2D quadtree.
double _norm
particle spatial norm (available ONLY after a call to build_norm)
a class to keep track of inclusion status in cone and in cocircular region while using minimal resour...
~CSphvicinity()
default destructor
#define EPSILON_COCIRCULAR
The following parameter controls cocircular situations.
void build(CSphmomentum *_parent, double _VR)
build the vicinity list from the list of points.
void set_particle_list(std::vector< CSphmomentum > &_particle_list)
set the particle_list
int index
internal particle number
void build_norm()
build the spatial normfrom 4-momentum info !!! WARNING !!! !!! computing the norm is the only time-co...
base class for dynamic coordinates management
base class for managing the spatial part of Cmomentum (defined after)
element in the vicinity of a parent.
void append_to_vicinity(CSphmomentum *v)
append a particle to the 'vicinity' list after having tested it and computed the angular-ordering qua...