2 #include "Common/binary_tree.h"
13 return _ecca - _ecc*_sin_ecca;
28 ASSERT(dsin_ecca_list_!=NULL);
40 template <
class Tptcl>
42 COMM::BinaryTree<Tptcl> &_bin) {
43 #ifdef ARTIFICIAL_PARTICLE_DEBUG
46 PS::F64 inverse_twopi = 1.0/(decca_*n_split_);
47 for (
int i=0; i<n_split_; i++) {
50 COMM::Binary::orbitToParticle(_ptcl_artificial[2*i], _ptcl_artificial[2*i+1], _bin, decca_*i,
gravitational_constant);
66 PS::F64 mass_member[2]= {_bin.m1, _bin.m2};
67 for (
int j=0; j<2; j++) {
68 Tptcl* pj = &_ptcl_artificial[2*i+j];
71 PS::F64 dmean_anomaly = calcMeanAnomaly(decca_list_[i], dsin_ecca_list_[i], _bin.ecc);
72 pj->mass = mass_member[j] * dmean_anomaly * inverse_twopi;
78 #ifdef ARTIFICIAL_PARTICLE_DEBUG
79 assert(mass_member[j]>0);
81 m_check[j] += pj->mass;
84 #ifdef ARTIFICIAL_PARTICLE_DEBUG
85 PS::F64vec pos_i_cm = (_ptcl_artificial[2*i].mass*_ptcl_artificial[2*i].pos+_ptcl_artificial[2*i+1].mass*_ptcl_artificial[2*i+1].pos)/(_ptcl_artificial[2*i].mass + _ptcl_artificial[2*i+1].mass);
86 assert(abs((pos_i_cm - _bin.pos)*(pos_i_cm - _bin.pos))<1e-10);
98 #ifdef ARTIFICIAL_PARTICLE_DEBUG
100 assert(abs(m_check[0]-_bin.m1)<1e-10);
101 assert(abs(m_check[1]-_bin.m2)<1e-10);
115 decca_ = 8.0*atan(1.0)/n_split_;
118 if (decca_list_ !=NULL)
delete [] decca_list_;
119 if (dsin_ecca_list_!=NULL)
delete [] dsin_ecca_list_;
121 decca_list_ =
new PS::F64[n_split_];
122 dsin_ecca_list_ =
new PS::F64[n_split_];
125 PS::F64 ecca_list [n_split_+1];
126 PS::F64 sin_ecca_list[n_split_+1];
127 for (
PS::S32 i=0; i<=n_split_; i++) {
128 ecca_list[i] = decca_*i-0.5*decca_;
129 sin_ecca_list[i] = std::sin(ecca_list[i]);
132 for (
PS::S32 i=0; i<n_split_; i++) {
133 decca_list_[i] = ecca_list [i+1] - ecca_list [i];
134 dsin_ecca_list_[i] = sin_ecca_list[i+1] - sin_ecca_list[i];
136 #ifdef ARTIFICIAL_PARTICLE_DEBUG
139 for (
PS::S32 i=0; i<n_split_; i++) {
141 decca_sum += decca_list_[i] - 0.5*dsin_ecca_list_[i];
142 assert(decca_list_[i]-dsin_ecca_list_[i]>=0.0);
144 ASSERT(abs(decca_sum-decca_*n_split_)<1e-10);
163 fwrite(&n_split_,
sizeof(
PS::S32), 1, _fp);
172 size_t rcount = fread(&n_split,
sizeof(
PS::S32), 1, _fin);
175 std::cerr<<
"Error: Data reading fails! requiring data number is 2, only obtain "<<rcount<<
".\n";
183 if (decca_list_!=NULL) {
184 delete [] decca_list_;
187 if (dsin_ecca_list_!=NULL) {
188 delete [] dsin_ecca_list_;
189 dsin_ecca_list_=NULL;
197 if (decca_list_!=NULL) {
198 delete [] decca_list_;
201 if (dsin_ecca_list_!=NULL) {
202 delete [] dsin_ecca_list_;
203 dsin_ecca_list_=NULL;
211 void print(std::ostream & _fout)
const{
212 _fout<<
"n_split : "<<n_split_<<std::endl