PeTar
N-body code for collisional gravitational systems
artificial_particles.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Common/binary_tree.h"
4 #include "tidal_tensor.hpp"
5 
6 #ifdef ORBIT_SAMPLING
7 #include "orbit_sampling.hpp"
9 #else
12 #endif
13 
15 
21 private:
22  PS::F64 mass_backup;
23  PS::F64 status;
24 
25 public:
27  ArtificialParticleInformation(): mass_backup(-PS::LARGE_FLOAT), status(-PS::LARGE_FLOAT) {}
28 
30 
32  void setParticleTypeToMember(const PS::F64 _mass = PS::LARGE_FLOAT, const PS::F64 _status = -PS::LARGE_FLOAT) {
33 #ifdef ARTIFICIAL_PARTICLE_DEBUG
34  assert(_status<0.0);
35 #endif
36  mass_backup = _mass;
37  status = _status;
38  };
39 
41  bool isMember() const {
42  return (status<0.0);
43  }
44 
46 
48  void setParticleTypeToCM(const PS::F64 _mass_backup = PS::LARGE_FLOAT, const PS::F64 _status=PS::LARGE_FLOAT) {
49 #ifdef ARTIFICIAL_PARTICLE_DEBUG
50  assert(_status>0.0&&_mass_backup>0.0);
51 #endif
52  status = _status;
53  mass_backup = _mass_backup;
54  };
55 
57  bool isCM() const {
58  return (status>0.0 && mass_backup>0.0);
59  }
60 
62  void setMassBackup(const PS::F64 _mass) {
63 #ifdef ARTIFICIAL_PARTICLE_DEBUG
64  assert((isMember()||isCM())&&_mass>0.0);
65 #endif
66  mass_backup = _mass;
67  }
68 
71 #ifdef ARTIFICIAL_PARTICLE_DEBUG
72  assert(isMember()||isCM());
73 #endif
74  return mass_backup;
75  }
76 
79  mass_backup = 0.0;
80  status = 0.0;
81  };
82 
84  bool isSingle() const {
85  return (status==0.0 && mass_backup==0.0);
86  }
87 
89 
91  void setParticleTypeToArtificial(const PS::F64 _status=PS::LARGE_FLOAT, const PS::F64 _mass_backup = 0.0) {
92 #ifdef ARTIFICIAL_PARTICLE_DEBUG
93  assert(_status>0.0);
94 #endif
95  status = _status;
96  mass_backup = _mass_backup;
97  };
98 
100  bool isArtificial() const {
101  return (status>0.0);
102  }
103 
105 
107  void storeData(const PS::F64 _data) {
108 #ifdef ARTIFICIAL_PARTICLE_DEBUG
109  assert(isArtificial());
110 #endif
111  if (_data>0.0) status = _data;
112  else mass_backup = _data;
113  }
114 
116 
118  PS::F64 getData(const bool is_positive) const {
119 #ifdef ARTIFICIAL_PARTICLE_DEBUG
120  assert(isArtificial());
121 #endif
122  if (is_positive) return status;
123  else return mass_backup;
124  }
125 
127  void setStatus(const PS::F64 _status) {
128 #ifdef ARTIFICIAL_PARTICLE_DEBUG
129  assert((isMember()&&_status<0.0)||(isArtificial()&&_status>0.0));
130 #endif
131  status = _status;
132  }
133 
135  PS::F64 getStatus() const {
136  return status;
137  }
138 
140  bool isUnused() const {
141  return (status<0.0 && mass_backup<0.0);
142  }
143 
146  status = - NUMERIC_FLOAT_MAX;
147  mass_backup = - NUMERIC_FLOAT_MAX;
148  }
149 
151 
155  static void printColumnTitle(std::ostream & _fout, const int _width=20) {
156  _fout<<std::setw(_width)<<"mass_bk"
157  <<std::setw(_width)<<"status";
158  }
159 
161 
166  static int printTitleWithMeaning(std::ostream & _fout, const int _counter=0, const int _offset=0) {
167  int counter = _counter;
168  counter++;
169  _fout<<std::setw(_offset)<<" "<<counter<<". mass_bk: artificial particle parameter 1 [formatted] (0.0)\n";
170  counter++;
171  _fout<<std::setw(_offset)<<" "<<counter<<". status: artificial particle parameter 2 [formatted] (0.0)\n";
172  return counter;
173  }
174 
176 
180  void printColumn(std::ostream & _fout, const int _width=20){
181  _fout<<std::setw(_width)<<mass_backup
182  <<std::setw(_width)<<status;
183  }
184 
186 
188  void writeAscii(FILE* _fout) const{
189  fprintf(_fout, "%26.17e %26.17e ",
190  this->mass_backup, this->status);
191  }
192 
194 
196  void writeBinary(FILE* _fin) const{
197  fwrite(this, sizeof(ArtificialParticleInformation), 1, _fin);
198  }
199 
201 
203  void readAscii(FILE* _fin) {
204  PS::S64 rcount=fscanf(_fin, "%lf %lf ",
205  &this->mass_backup, &this->status);
206  if (rcount<2) {
207  std::cerr<<"Error: Data reading fails! requiring data number is 2, only obtain "<<rcount<<".\n";
208  abort();
209  }
210  }
211 
213 
215  void readBinary(FILE* _fin) {
216  size_t rcount = fread(this, sizeof(ArtificialParticleInformation), 1, _fin);
217  if (rcount<1) {
218  std::cerr<<"Error: Data reading fails! requiring data number is 1, only obtain "<<rcount<<".\n";
219  abort();
220  }
221  }
222 
224  void print(std::ostream & _fout) const{
225  _fout<<" mass_bk="<<mass_backup
226  <<" status="<<status;
227  }
228 
229 };
230 
233 public:
234  // be careful to make consistent read/writeBinary and operator = if modified
239 
242 
244  bool checkParams() {
246  ASSERT(r_tidal_tensor>=0.0);
247  ASSERT(id_offset>0);
250  return true;
251  }
252 
254 
276  template <class Tptcl>
277  void createArtificialParticles(Tptcl* _ptcl_artificial,
278  COMM::BinaryTree<Tptcl,COMM::Binary> &_bin,
279  const PS::F64* _data_to_store,
280  const PS::S32 _n_data) {
281  ASSERT(checkParams());
282  // set id and status.d except cm particle
283  PS::S32 n_artificial = getArtificialParticleN();
284  for (int i=0; i<n_artificial-1; i++) {
285  Tptcl* pi = &_ptcl_artificial[i];
286  Tptcl* binary_member_i = _bin.getMember(i%2);
287  pi->id = id_offset + abs(binary_member_i->id)*n_artificial +i;
288  auto& pi_artificial = pi->group_data.artificial;
289  pi_artificial.setParticleTypeToArtificial(PS::F64(i+1));
290 #ifdef ARTIFICIAL_PARTICLE_DEBUG
291  assert(pi_artificial.isArtificial());
292 #endif
293  }
294 
295  // First TidalTensor::getParticleN() is used for tidal tensor points
296 #ifdef ARTIFICIAL_PARTICLE_DEBUG
297  assert(r_tidal_tensor<=_bin.changeover.getRin());
298 #endif
299  TidalTensor::createTidalTensorMeasureParticles(_ptcl_artificial, *((Tptcl*)&_bin), r_tidal_tensor);
300 
301  // remaining is for orbital sample particles
302  orbit_manager.createSampleParticles(&(_ptcl_artificial[getIndexOffsetOrb()]), _bin);
303 
304  // store the component member number
305  for (int j=0; j<2; j++) {
306  PS::S32 n_members = _bin.isMemberTree(j) ? ((COMM::BinaryTree<Tptcl,COMM::Binary>*)(_bin.getMember(j)))->getMemberN() : 1;
307  _ptcl_artificial[j].group_data.artificial.storeData(n_members);
308 #ifdef ARTIFICIAL_PARTICLE_DEBUG
309  assert(n_members>0);
310 #endif
311  }
312 
313  // store the additional data (should be positive)
314  // ensure the data size is not overflow
315  assert(_n_data+2<n_artificial-1);
316  for (int j=0; j<_n_data; j++) {
317  _ptcl_artificial[j+2].group_data.artificial.storeData(_data_to_store[j]);
318 #ifdef ARTIFICIAL_PARTICLE_DEBUG
319  assert(_data_to_store[j]>0);
320 #endif
321  }
322 
323  // last member is the c.m. particle
324  Tptcl* pcm;
325  pcm = &_ptcl_artificial[getIndexOffsetCM()];
326  pcm->group_data.artificial.setParticleTypeToCM(_bin.mass, _bin.getMemberN());
327 #ifdef ARTIFICIAL_PARTICLE_DEBUG
328  assert(pcm->group_data.artificial.isCM());
329 #endif
330  if (getOrbitalParticleN()>0) pcm->mass = 0.0;
331  else pcm->mass = _bin.mass;
332  pcm->pos = _bin.pos;
333  pcm->vel = _bin.vel;
334  pcm->id = - std::abs(_bin.id);
335  }
336 
338 
342  template <class Tptcl>
343  void correctOrbitalParticleForce(Tptcl* _ptcl_artificial) {
344  auto* porb = getOrbitalParticles(_ptcl_artificial);
345  const PS::S32 n_orb = getOrbitalParticleN();
346 
347  if (n_orb>0) {
348  auto* pcm = getCMParticles(_ptcl_artificial);
349  PS::F64vec& acc_cm = pcm->acc;
350 
351  acc_cm=PS::F64vec(0.0);
352  PS::F64 m_ob_tot = 0.0;
353 
354  for (int k=0; k<n_orb; k++) {
355  acc_cm += porb[k].mass*porb[k].acc;
356  m_ob_tot += porb[k].mass;
357  }
358  acc_cm /= m_ob_tot;
359 
360 #ifdef ARTIFICIAL_PARTICLE_DEBUG
361  assert(abs(m_ob_tot-pcm->group_data.artificial.getMassBackup())<1e-10);
362 #endif
363  }
364  }
365 
367 
372  template <class Tptcl>
373  void correctArtficialParticleForce(Tptcl* _ptcl_artificial) {
374  auto* pcm = getCMParticles(_ptcl_artificial);
375  // substract c.m. force (acc) from tidal tensor force (acc)
376  auto* ptt = getTidalTensorParticles(_ptcl_artificial);
377  TidalTensor::subtractCMForce(ptt, *pcm);
378 
379  // not consistent
380  // After c.m. force used, it can be replaced by the averaged force on orbital particles
381  // correctOrbitalParticleForce(_ptcl_artificial);
382  }
383 
385  template <class Tptcl>
386  Tptcl* getOrbitalParticles(Tptcl* _ptcl_list) {
387 #ifdef ARTIFICIAL_PARTICLE_DEBUG
388  assert(_ptcl_list[getIndexOffsetOrb()].group_data.artificial.isArtificial());
389 #endif
390  return &_ptcl_list[getIndexOffsetOrb()];
391  }
392 
394  template <class Tptcl>
395  Tptcl* getTidalTensorParticles(Tptcl* _ptcl_list) {
396 #ifdef ARTIFICIAL_PARTICLE_DEBUG
397  assert(_ptcl_list[getIndexOffsetTT()].group_data.artificial.isArtificial());
398 #endif
399  return &_ptcl_list[getIndexOffsetTT()];
400  }
401 
403  template <class Tptcl>
404  Tptcl* getCMParticles(Tptcl* _ptcl_list) {
405 #ifdef ARTIFICIAL_PARTICLE_DEBUG
406  assert(_ptcl_list[getIndexOffsetCM()].group_data.artificial.isCM());
407 #endif
408  return &_ptcl_list[getIndexOffsetCM()];
409  }
410 
413  return 0;
414  }
415 
418  return TidalTensor::getParticleN();
419  }
420 
424  }
425 
429  }
430 
433  return TidalTensor::getParticleN();
434  }
435 
438  return orbit_manager.getParticleN();
439  }
440 
442  template <class Tptcl>
443  PS::S32 getLeftMemberN(const Tptcl* _ptcl_list) const {
444 #ifdef ARTIFICIAL_PARTICLE_DEBUG
445  assert(_ptcl_list[0].group_data.artificial.isArtificial());
446 #endif
447  return PS::S32(_ptcl_list[0].group_data.artificial.getData());
448  }
449 
451  template <class Tptcl>
452  PS::S32 getMemberN(const Tptcl* _ptcl_list) const {
453 #ifdef ARTIFICIAL_PARTICLE_DEBUG
454  assert(_ptcl_list[getIndexOffsetCM()].group_data.artificial.isCM());
455 #endif
456  return PS::S32(_ptcl_list[getIndexOffsetCM()].group_data.artificial.getData(true));
457  }
458 
460  template <class Tptcl>
461  PS::S32 getRightMemberN(const Tptcl* _ptcl_list) const {
462 #ifdef ARTIFICIAL_PARTICLE_DEBUG
463  assert(_ptcl_list[1].group_data.artificial.isArtificial());
464 #endif
465  return PS::S32(_ptcl_list[1].group_data.artificial.getData(true));
466  }
467 
469  template <class Tptcl>
470  PS::S64 getCMID(const Tptcl* _ptcl_list) const {
471 #ifdef ARTIFICIAL_PARTICLE_DEBUG
472  assert(_ptcl_list[getIndexOffsetCM()].group_data.artificial.isCM());
473 #endif
474  return -PS::S64(_ptcl_list[getIndexOffsetCM()].id);
475  }
476 
478  template <class Tptcl>
479  PS::F64 getStoredData(const Tptcl* _ptcl_list, const PS::S32 _index, const bool _is_positive) const {
480 #ifdef ARTIFICIAL_PARTICLE_DEBUG
481  assert(_ptcl_list[_index+2].group_data.artificial.isArtificial());
482 #endif
483  return _ptcl_list[_index+2].group_data.artificial.getData(_is_positive);
484  }
485 
487 
489  void writeBinary(FILE *_fp) {
490  fwrite(&r_tidal_tensor, sizeof(PS::F64), 1, _fp);
491  fwrite(&id_offset, sizeof(PS::S64), 1, _fp);
492  fwrite(&gravitational_constant, sizeof(PS::F64), 1, _fp);
494  }
495 
497 
499  void readBinary(FILE *_fin) {
500  size_t rcount = 0;
501  rcount += fread(&r_tidal_tensor, sizeof(PS::F64), 1, _fin);
502  rcount += fread(&id_offset, sizeof(PS::S64), 1, _fin);
503  rcount += fread(&gravitational_constant, sizeof(PS::F64), 1, _fin);
504  if (rcount<3) {
505  std::cerr<<"Error: Data reading fails! requiring data number is 2, only obtain "<<rcount<<".\n";
506  abort();
507  }
509  }
510 
512  void print(std::ostream & _fout) const{
513  _fout<<"r_tidal_tensor : "<<r_tidal_tensor<<std::endl
514  <<"id_offset : "<<id_offset<<std::endl
515  <<"G: : "<<gravitational_constant<<std::endl;
516  orbit_manager.print(_fout);
517  }
518 
519 #ifdef ARTIFICIAL_PARTICLE_DEBUG
520  template <class Tptcl, class Tpart>
521  void checkConsistence(Tptcl* _ptcl_member, Tpart* _ptcl_artificial) {
522  // check id
523  PS::S64 id_min = _ptcl_member[0].id;
524  for(int j=0; j<getMemberN(_ptcl_artificial); j++) id_min = std::min(id_min,_ptcl_member[j].id);
525  assert(getCMID(_ptcl_artificial) == id_min);
526  // not consistent if first member is single and second is binary
527  //PS::S32 id_mem[2];
528  //id_mem[0] = _ptcl_member[0].id;
529  //id_mem[1] = _ptcl_member[getLeftMemberN(_ptcl_artificial)].id;
531  //for (int j=0; j<getArtificialParticleN()-1; j+=2) {
532  // // first member
533  // PS::S32 id_offset_j1 = _ptcl_artificial[j].id - j/2- id_mem[0]*(getArtificialParticleN()-1)/2;
534  // // second member
535  // PS::S32 id_offset_j2 = _ptcl_artificial[j+1].id - j/2 - id_mem[1]*(getArtificialParticleN()-1)/2;
536  // assert(id_offset_j1==id_offset_j2);
537  //}
538 
539  // check whether c.m. pos. are consistent
540  // Cannot do velocity check because cm is not kicked
541  PS::F64 mass_cm_check=0.0;
542  PS::F64vec pos_cm_check=PS::F64vec(0.0);
543 
544  for(int j=0; j<getMemberN(_ptcl_artificial); j++) {
545  mass_cm_check += _ptcl_member[j].mass;
546  pos_cm_check += _ptcl_member[j].pos*_ptcl_member[j].mass;
547  }
548 
549  pos_cm_check /= mass_cm_check;
550 
551  auto* pcm = getCMParticles(_ptcl_artificial);
552  assert(abs(mass_cm_check-pcm->group_data.artificial.getMassBackup())<1e-10);
553  PS::F64vec dpos = pos_cm_check-pcm->pos;
554  assert(abs(dpos*dpos)<1e-20);
555  }
556 #endif
557 
558 };
ArtificialParticleManager::getCMParticles
Tptcl * getCMParticles(Tptcl *_ptcl_list)
get c.m. particle list address from a artificial particle array
Definition: artificial_particles.hpp:404
TidalTensor::getParticleN
static PS::S32 getParticleN()
get particle number
Definition: tidal_tensor.hpp:435
ArtificialParticleManager::getCMID
PS::S64 getCMID(const Tptcl *_ptcl_list) const
get center of mass id
Definition: artificial_particles.hpp:470
TidalTensor::createTidalTensorMeasureParticles
static void createTidalTensorMeasureParticles(Tptcl *_ptcl_tt, const Tptcl &_ptcl_cm, const PS::F64 _size)
create tidal tensor measurement particles
Definition: tidal_tensor.hpp:51
PseudoParticleMultipoleManager::createSampleParticles
void createSampleParticles(Tptcl *_ptcl_artificial, COMM::BinaryTree< Tptcl, COMM::Binary > &_bin)
create pseudoparticle multipole particles
Definition: pseudoparticle_multipole.hpp:19
ArtificialParticleManager::getStoredData
PS::F64 getStoredData(const Tptcl *_ptcl_list, const PS::S32 _index, const bool _is_positive) const
get stored data
Definition: artificial_particles.hpp:479
ArtificialParticleManager::print
void print(std::ostream &_fout) const
print parameters
Definition: artificial_particles.hpp:512
PIKG::S32
int32_t S32
Definition: pikg_vector.hpp:24
ArtificialParticleInformation::readBinary
void readBinary(FILE *_fin)
read class data with BINARY format
Definition: artificial_particles.hpp:215
PseudoParticleMultipoleManager::checkParams
bool checkParams()
check paramters
Definition: pseudoparticle_multipole.hpp:9
ArtificialParticleInformation::setParticleTypeToMember
void setParticleTypeToMember(const PS::F64 _mass=PS::LARGE_FLOAT, const PS::F64 _status=-PS::LARGE_FLOAT)
set particle type to member
Definition: artificial_particles.hpp:32
PIKG::F64vec
Vector3< F64 > F64vec
Definition: pikg_vector.hpp:167
ArtificialParticleManager::correctOrbitalParticleForce
void correctOrbitalParticleForce(Tptcl *_ptcl_artificial)
correct orbit-samping/pseudo particles force
Definition: artificial_particles.hpp:343
ArtificialParticleManager::getMemberN
PS::S32 getMemberN(const Tptcl *_ptcl_list) const
get member number
Definition: artificial_particles.hpp:452
ArtificialParticleInformation::writeAscii
void writeAscii(FILE *_fout) const
write class data with ASCII format
Definition: artificial_particles.hpp:188
PseudoParticleMultipoleManager::getParticleN
static PS::S32 getParticleN()
get particle number
Definition: pseudoparticle_multipole.hpp:58
ArtificialParticleManager::checkParams
bool checkParams()
check paramters
Definition: artificial_particles.hpp:244
ArtificialParticleManager::correctArtficialParticleForce
void correctArtficialParticleForce(Tptcl *_ptcl_artificial)
correct artificial particles force for furture use
Definition: artificial_particles.hpp:373
PIKG::F64
double F64
Definition: pikg_vector.hpp:17
ArtificialParticleManager::getLeftMemberN
PS::S32 getLeftMemberN(const Tptcl *_ptcl_list) const
get left member number
Definition: artificial_particles.hpp:443
PIKG::S64
int64_t S64
Definition: pikg_vector.hpp:23
ArtificialParticleManager::r_tidal_tensor
PS::F64 r_tidal_tensor
Definition: artificial_particles.hpp:235
OrbitalSamplingManager
orbital sampling method for counter force from binary
Definition: orbit_sampling.hpp:6
ArtificialParticleManager::readBinary
void readBinary(FILE *_fin)
read class data to file with binary format
Definition: artificial_particles.hpp:499
ArtificialParticleManager::getTidalTensorParticleN
PS::S32 getTidalTensorParticleN() const
get artificial particle total number
Definition: artificial_particles.hpp:432
ArtificialParticleInformation::getStatus
PS::F64 getStatus() const
get status
Definition: artificial_particles.hpp:135
PIKG::min
T min(const Vector3< T > &v)
Definition: pikg_vector.hpp:150
ArtificialParticleManager::getRightMemberN
PS::S32 getRightMemberN(const Tptcl *_ptcl_list) const
get right member number
Definition: artificial_particles.hpp:461
ArtificialParticleManager::getIndexOffsetTT
PS::S32 getIndexOffsetTT() const
tidal tensor particle index offset
Definition: artificial_particles.hpp:412
ArtificialParticleInformation::printColumn
void printColumn(std::ostream &_fout, const int _width=20)
print data of class members using column style
Definition: artificial_particles.hpp:180
ArtificialParticleManager::orbit_manager
OrbitManager orbit_manager
gravitational constant
Definition: artificial_particles.hpp:238
ArtificialParticleManager::getArtificialParticleN
PS::S32 getArtificialParticleN() const
get artificial particle total number
Definition: artificial_particles.hpp:427
ArtificialParticleInformation::isCM
bool isCM() const
return whether the particle type is c.m.
Definition: artificial_particles.hpp:57
PseudoParticleMultipoleManager
PseudoParticle Multipole method for counter force from binaries.
Definition: pseudoparticle_multipole.hpp:6
ArtificialParticleInformation::ArtificialParticleInformation
ArtificialParticleInformation()
initializer
Definition: artificial_particles.hpp:27
OrbitManager
PseudoParticleMultipoleManager OrbitManager
Definition: artificial_particles.hpp:11
TidalTensor::subtractCMForce
static void subtractCMForce(Tptcl *_ptcl_tt, const Tptcl &_ptcl_cm)
subtract c.m. force from measure points
Definition: tidal_tensor.hpp:94
ArtificialParticleInformation::storeData
void storeData(const PS::F64 _data)
store one data (only in artificial particles)
Definition: artificial_particles.hpp:107
ArtificialParticleManager::createArtificialParticles
void createArtificialParticles(Tptcl *_ptcl_artificial, COMM::BinaryTree< Tptcl, COMM::Binary > &_bin, const PS::F64 *_data_to_store, const PS::S32 _n_data)
create artificial particles
Definition: artificial_particles.hpp:277
ArtificialParticleInformation::print
void print(std::ostream &_fout) const
print parameters
Definition: artificial_particles.hpp:224
ArtificialParticleInformation::isUnused
bool isUnused() const
return whether the particle is unused
Definition: artificial_particles.hpp:140
ArtificialParticleInformation::getMassBackup
PS::F64 getMassBackup() const
get backup mass
Definition: artificial_particles.hpp:70
ArtificialParticleManager::id_offset
PS::S64 id_offset
tidal tensor maximum distance of particles
Definition: artificial_particles.hpp:236
ArtificialParticleInformation::setMassBackup
void setMassBackup(const PS::F64 _mass)
set backup mass
Definition: artificial_particles.hpp:62
ArtificialParticleInformation::getData
PS::F64 getData(const bool is_positive) const
get stored data (only in artificial particles)
Definition: artificial_particles.hpp:118
ArtificialParticleInformation::printTitleWithMeaning
static int printTitleWithMeaning(std::ostream &_fout, const int _counter=0, const int _offset=0)
print column title with meaning (each line for one column)
Definition: artificial_particles.hpp:166
ArtificialParticleManager::getTidalTensorParticles
Tptcl * getTidalTensorParticles(Tptcl *_ptcl_list)
get tidal tensor particle list address from a artificial particle array
Definition: artificial_particles.hpp:395
PseudoParticleMultipoleManager::writeBinary
void writeBinary(FILE *_fp)
write class data to file with binary format
Definition: pseudoparticle_multipole.hpp:65
ArtificialParticleInformation::isSingle
bool isSingle() const
return whether the particle type is single
Definition: artificial_particles.hpp:84
ArtificialParticleInformation::readAscii
void readAscii(FILE *_fin)
read class data with ASCII format
Definition: artificial_particles.hpp:203
pseudoparticle_multipole.hpp
ArtificialParticleManager::writeBinary
void writeBinary(FILE *_fp)
write class data to file with binary format
Definition: artificial_particles.hpp:489
ArtificialParticleManager::getIndexOffsetOrb
PS::S32 getIndexOffsetOrb() const
orbital/pseudo particle index offset
Definition: artificial_particles.hpp:417
ArtificialParticleInformation::isMember
bool isMember() const
return whether the particle type is member
Definition: artificial_particles.hpp:41
ArtificialParticleInformation::setParticleTypeToSingle
void setParticleTypeToSingle()
set particle type to single
Definition: artificial_particles.hpp:78
orbit_sampling.hpp
ArtificialParticleInformation::setParticleTypeToUnused
void setParticleTypeToUnused()
set particle type to unused
Definition: artificial_particles.hpp:145
PseudoParticleMultipoleManager::print
void print(std::ostream &_fout) const
print parameters
Definition: pseudoparticle_multipole.hpp:75
ArtificialParticleInformation::printColumnTitle
static void printColumnTitle(std::ostream &_fout, const int _width=20)
print titles of class members using column style
Definition: artificial_particles.hpp:155
PseudoParticleMultipoleManager::readBinary
void readBinary(FILE *_fin)
read class data to file with binary format
Definition: pseudoparticle_multipole.hpp:71
ASSERT
#define ASSERT(expr)
Definition: hard_assert.hpp:238
ArtificialParticleManager
class to organize artificial particles
Definition: artificial_particles.hpp:232
ArtificialParticleManager::getIndexOffsetCM
PS::S32 getIndexOffsetCM() const
CM particle index offset.
Definition: artificial_particles.hpp:422
ArtificialParticleInformation::setParticleTypeToCM
void setParticleTypeToCM(const PS::F64 _mass_backup=PS::LARGE_FLOAT, const PS::F64 _status=PS::LARGE_FLOAT)
set particle type to artificial
Definition: artificial_particles.hpp:48
ArtificialParticleManager::gravitational_constant
PS::F64 gravitational_constant
offset to generate ID for artificial particles
Definition: artificial_particles.hpp:237
ArtificialParticleInformation::writeBinary
void writeBinary(FILE *_fin) const
write class data with BINARY format
Definition: artificial_particles.hpp:196
tidal_tensor.hpp
ArtificialParticleManager::getOrbitalParticleN
PS::S32 getOrbitalParticleN() const
get orbitial particle number
Definition: artificial_particles.hpp:437
ArtificialParticleInformation::setStatus
void setStatus(const PS::F64 _status)
set status
Definition: artificial_particles.hpp:127
ArtificialParticleInformation::setParticleTypeToArtificial
void setParticleTypeToArtificial(const PS::F64 _status=PS::LARGE_FLOAT, const PS::F64 _mass_backup=0.0)
set particle type to artificial
Definition: artificial_particles.hpp:91
ArtificialParticleInformation::isArtificial
bool isArtificial() const
return whether the particle type is artificial
Definition: artificial_particles.hpp:100
ArtificialParticleManager::getOrbitalParticles
Tptcl * getOrbitalParticles(Tptcl *_ptcl_list)
get oribit/pseudo particle list address from a artificial particle array
Definition: artificial_particles.hpp:386
ArtificialParticleInformation
class to store necessary information for using artificial particles
Definition: artificial_particles.hpp:20
ArtificialParticleManager::ArtificialParticleManager
ArtificialParticleManager()
orbit particle method
Definition: artificial_particles.hpp:241