PeTar
N-body code for collisional gravitational systems
ptcl.hpp
Go to the documentation of this file.
1 #pragma once
2 #include<particle_simulator.hpp>
3 #include"particle_base.hpp"
4 #include"changeover.hpp"
5 #define ASSERT assert
7 
9 //const PS::F64 SAFTY_FACTOR_FOR_SEARCH_SQ = SAFTY_FACTOR_FOR_SEARCH * SAFTY_FACTOR_FOR_SEARCH;
10 //const PS::F64 SAFTY_OFFSET_FOR_SEARCH = 1e-7;
11 //const PS::F64 SAFTY_OFFSET_FOR_SEARCH = 0.0;
12 
14 
21 
23 
25 
27  data_int64 = _data.data_int64;
28  return *this;
29  }
30 };
31 
33 enum class GroupDataMode{artificial=1, cm=2, none=0};
34 
36 class Ptcl: public ParticleBase{
37 public:
39  PS::S64 id; // positive for single, artificial but not cm, 0 for unused particle
46  //static PS::F64vec vel_cm;
48 
49  Ptcl(): ParticleBase(), r_search(-PS::LARGE_FLOAT), id(0), group_data(), changeover() {}
50 
51  template<class Tptcl>
52  Ptcl(const Tptcl& _p) { Ptcl::DataCopy(_p); }
53 
54  template<class Tptcl>
55  Ptcl(const Tptcl& _p, const PS::F64 _r_search, const PS::S64 _id, const GroupDataDeliver& _group_data, const ChangeOver& _co): ParticleBase(_p), r_search(_r_search), id(_id), group_data(_group_data), changeover(_co) {}
56 
57  template<class Tptcl>
58  void DataCopy(const Tptcl& _p) {
60  r_search = _p.r_search;
61  id = _p.id;
62  group_data = _p.group_data;
63  changeover = _p.changeover;
64  }
65 
66  template<class Tptcl>
67  Ptcl& operator = (const Tptcl& _p) {
68  Ptcl::DataCopy(_p);
69  return *this;
70  }
71 
72  void print(std::ostream & _fout) const{
73  ParticleBase::print(_fout);
74  _fout<<" r_search="<<r_search
75  <<" id="<<id;
77  changeover.print(_fout);
78  }
79 
81 
85  static void printColumnTitle(std::ostream & _fout, const int _width=20) {
86  ParticleBase::printColumnTitle(_fout, _width);
87  _fout<<std::setw(_width)<<"r_search"
88  <<std::setw(_width)<<"id";
90  ChangeOver::printColumnTitle(_fout, _width);
91  }
92 
94 
99  static int printTitleWithMeaning(std::ostream & _fout, const int _counter=0, const int _offset=0) {
100  int counter = _counter;
101  counter = ParticleBase::printTitleWithMeaning(_fout, counter, _offset);
102  counter++;
103  _fout<<std::setw(_offset)<<" "<<counter<<". r_search: neighbor searching radius (0.0)\n";
104  counter++;
105  _fout<<std::setw(_offset)<<" "<<counter<<". id: identification of particle, should be a positive unique value (>0)\n";
106  counter = ArtificialParticleInformation::printTitleWithMeaning(_fout, counter, _offset);
107  counter = ChangeOver::printTitleWithMeaning(_fout, counter, _offset);
108  return counter;
109  }
110 
112 
116  void printColumn(std::ostream & _fout, const int _width=20){
117  ParticleBase::printColumn(_fout, _width);
118  _fout<<std::setw(_width)<<r_search
119  <<std::setw(_width)<<id;
120  group_data.artificial.printColumn(_fout, _width);
121  changeover.printColumn(_fout, _width);
122  }
123 
125 
130  template <class Tpcm>
131  void printColumnWithOffset(Tpcm& _pcm, std::ostream & _fout, const int _width=20){
132  ParticleBase::printColumnWithOffset(_pcm, _fout, _width);
133  _fout<<std::setw(_width)<<r_search
134  <<std::setw(_width)<<id;
135  group_data.artificial.printColumn(_fout, _width);
136  changeover.printColumn(_fout, _width);
137  }
138 
140 
142  void writeAscii(FILE* _fout) const{
144 #ifdef GROUP_DATA_WRITE_ARTIFICIAL
145  fprintf(_fout, "%26.17e %lld ",
146  this->r_search, this->id);
147  group_data.artificial.writeAscii(_fout);
148 #else
149  fprintf(_fout, "%26.17e %lld %lld %lld",
150  this->r_search, this->id, this->group_data.data_int64.data1, this->group_data.data_int64.data2);
151 #endif
152  changeover.writeAscii(_fout);
153  }
154 
156 
158  void writeBinary(FILE* _fout) const{
160  fwrite(&(this->r_search), sizeof(PS::F64), 4, _fout);
161  //group_data.artificial.writeBinary(_fout);
162  changeover.writeBinary(_fout);
163  }
164 
166 
168  void readAscii(FILE* _fin) {
170 #ifdef GROUP_DATA_WRITE_ARTIFICIAL
171  PS::S64 rcount=fscanf(_fin, "%lf %lld ",
172  &this->r_search, &this->id);
173  if (rcount<2) {
174  std::cerr<<"Error: Ptcl data reading fails! requiring data number is 2, only obtain "<<rcount<<".\n";
175  std::cerr<<"Check your input data, whether the consistent features (interrupt mode and external mode) are used in configuring petar and the data generation\n";
176  abort();
177  }
179 #else
180  PS::S64 rcount=fscanf(_fin, "%lf %lld %lld %lld",
181  &this->r_search, &this->id, &this->group_data.data_int64.data1, &this->group_data.data_int64.data2);
182  if (rcount<4) {
183  std::cerr<<"Error: Ptcl data reading fails! requiring data number is 4, only obtain "<<rcount<<".\n";
184  std::cerr<<"Check your input data, whether the consistent features (interrupt mode and external mode) are used in configuring petar and the data generation\n";
185  abort();
186  }
187 #endif
188  changeover.readAscii(_fin);
189  }
190 
192 
194  void readBinary(FILE* _fin) {
196  size_t rcount = fread(&(this->r_search), sizeof(PS::F64), 4, _fin);
197  if (rcount<4) {
198  std::cerr<<"Error: Ptcl data reading fails! requiring data number is 4, only obtain "<<rcount<<".\n";
199  std::cerr<<"Check your input data, whether the consistent features (interrupt mode and external mode) are used in configuring petar and the data generation\n";
200  abort();
201  }
202  //group_data.artificial.readBinary(_fin);
203  changeover.readBinary(_fin);
204  }
205 
207  void setParticleCMAddress(const PS::S64 _adr) {
208 #ifdef ARTIFICIAL_PARTICLE_DEBUG
209  assert(group_data.artificial.isMember()&&_adr>0);
210 #endif
212  }
213 
216 #ifdef ARTIFICIAL_PARTICLE_DEBUG
217  assert(group_data.artificial.isMember());
218 #endif
220  if (status==-PS::LARGE_FLOAT) return -1;
221  else return PS::S64(-status);
222  }
223 
225 
227  void calcRSearch(const PS::F64 _dt_tree) {
228  //PS::F64vec dv = vel- vel_cm;
229  //PS::F64 v = std::sqrt(dv*dv);
230  //r_search = std::max(v*_dt_tree*search_factor+changeover.getRout(), r_search_min);
232  //r_search = std::max(std::sqrt(vel*vel)*dt_tree*search_factor, std::sqrt(mass*mean_mass_inv)*r_search_min);
233 #ifdef HARD_DEBUG
234  assert(r_search>0);
235  assert(r_search_min>0);
236  assert(search_factor>0);
237 #endif
238  }
239 
242 #ifdef HARD_DEBUG
243  assert(r_search>changeover.getRout());
244 #endif
245  return r_search;
246  }
247 
250  return changeover.getRin();
251  }
252 
254  PS::F64 getRGroup() const {
255 #ifdef HARD_DEBUG
256  assert(r_group_crit_ratio>0);
257 #endif
259  }
260 
261 
262 };
263 
264 #undef ASSERT
Ptcl::DataCopy
void DataCopy(const Tptcl &_p)
Definition: ptcl.hpp:58
GroupDataDeliver::cm
struct GroupDataDeliver::@4 cm
Ptcl::Ptcl
Ptcl(const Tptcl &_p)
Definition: ptcl.hpp:52
Ptcl::setParticleCMAddress
void setParticleCMAddress(const PS::S64 _adr)
set status to c.m. particle address
Definition: ptcl.hpp:207
ParticleBase::writeBinary
void writeBinary(FILE *fp) const
write class data with BINARY format
Definition: particle_base.hpp:178
ParticleBase
Basic particle class.
Definition: particle_base.hpp:20
Ptcl::group_data_mode
static GroupDataMode group_data_mode
Definition: ptcl.hpp:47
Ptcl::mean_mass_inv
static PS::F64 mean_mass_inv
Definition: ptcl.hpp:45
ParticleBase::printColumnTitle
static void printColumnTitle(std::ostream &_fout, const int _width=20)
print titles of class members using column style
Definition: particle_base.hpp:217
ParticleBase::readBinary
void readBinary(FILE *fp)
read class data with BINARY format
Definition: particle_base.hpp:186
ArtificialParticleInformation::writeAscii
void writeAscii(FILE *_fout) const
write class data with ASCII format
Definition: artificial_particles.hpp:188
ChangeOver::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: changeover.hpp:119
GroupDataMode::cm
@ cm
Ptcl::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: ptcl.hpp:99
GroupDataDeliver
group data delivery, used for two purpose
Definition: ptcl.hpp:17
GroupDataDeliver::GroupDataDeliver
GroupDataDeliver(const GroupDataDeliver &_data)
Definition: ptcl.hpp:24
PIKG::F64
double F64
Definition: pikg_vector.hpp:17
ParticleBase::printColumn
void printColumn(std::ostream &_fout, const int _width=20) const
print data of class members using column style
Definition: particle_base.hpp:274
Ptcl::calcRSearch
void calcRSearch(const PS::F64 _dt_tree)
calculate new rsearch
Definition: ptcl.hpp:227
GroupDataMode::artificial
@ artificial
Ptcl::getRNeighbor
PS::F64 getRNeighbor() const
Get neighbor distance criterion.
Definition: ptcl.hpp:241
Ptcl::writeBinary
void writeBinary(FILE *_fout) const
write class data with BINARY format
Definition: ptcl.hpp:158
GroupDataDeliver::vel
PS::F32vec vel
Definition: ptcl.hpp:19
Ptcl::printColumnTitle
static void printColumnTitle(std::ostream &_fout, const int _width=20)
print titles of class members using column style
Definition: ptcl.hpp:85
Ptcl
Particle class.
Definition: ptcl.hpp:36
ChangeOver::writeBinary
void writeBinary(FILE *_fp) const
write class data to file with binary format
Definition: changeover.hpp:141
PIKG::S64
int64_t S64
Definition: pikg_vector.hpp:23
ParticleBase::printColumnWithOffset
void printColumnWithOffset(Tpcm &_pcm, std::ostream &_fout, const int _width=20) const
print data of class members with pos and vel offset using column style
Definition: particle_base.hpp:301
ParticleBase::vel
PS::F64vec vel
Definition: particle_base.hpp:25
SAFTY_FACTOR_FOR_SEARCH
const PS::F64 SAFTY_FACTOR_FOR_SEARCH
Definition: ptcl.hpp:8
Ptcl::operator=
Ptcl & operator=(const Tptcl &_p)
Definition: ptcl.hpp:67
PIKG::F32vec
Vector3< F32 > F32vec
Definition: pikg_vector.hpp:168
Ptcl::r_search_min
static PS::F64 r_search_min
Definition: ptcl.hpp:43
ChangeOver::printColumnTitle
static void printColumnTitle(std::ostream &_fout, const int _width=20)
print titles of class members using column style
Definition: changeover.hpp:108
ArtificialParticleInformation::getStatus
PS::F64 getStatus() const
get status
Definition: artificial_particles.hpp:135
GroupDataMode
GroupDataMode
group data deliver mode
Definition: ptcl.hpp:33
BinaryInterruptState::none
@ none
GroupDataDeliver::operator=
GroupDataDeliver & operator=(const GroupDataDeliver &_data)
Definition: ptcl.hpp:26
ArtificialParticleInformation::printColumn
void printColumn(std::ostream &_fout, const int _width=20)
print data of class members using column style
Definition: artificial_particles.hpp:180
ChangeOver::printColumn
void printColumn(std::ostream &_fout, const int _width=20)
print data of class members using column style
Definition: changeover.hpp:133
Ptcl::r_search
PS::F64 r_search
Definition: ptcl.hpp:38
ChangeOver
Changeover function class.
Definition: changeover.hpp:7
Ptcl::writeAscii
void writeAscii(FILE *_fout) const
write class data with ASCII format
Definition: ptcl.hpp:142
Ptcl::changeover
ChangeOver changeover
Definition: ptcl.hpp:41
GroupDataDeliver::data_int64
struct GroupDataDeliver::@5 data_int64
GroupDataDeliver::GroupDataDeliver
GroupDataDeliver()
Definition: ptcl.hpp:22
ChangeOver::writeAscii
void writeAscii(FILE *_fp) const
write class data to file with binary format
Definition: changeover.hpp:160
Ptcl::getRGroupCandidate
PS::F64 getRGroupCandidate() const
Get group candidate distance criterion.
Definition: ptcl.hpp:249
ArtificialParticleInformation::print
void print(std::ostream &_fout) const
print parameters
Definition: artificial_particles.hpp:224
changeover.hpp
ParticleBase::DataCopy
void DataCopy(const Tp &din)
Copy from another ParticleBase.
Definition: particle_base.hpp:327
ChangeOver::readBinary
void readBinary(FILE *_fin)
read class data to file with binary format
Definition: changeover.hpp:148
ChangeOver::getRin
const Float & getRin() const
get r_in
Definition: changeover.hpp:87
Ptcl::printColumn
void printColumn(std::ostream &_fout, const int _width=20)
print data of class members using column style
Definition: ptcl.hpp:116
Ptcl::printColumnWithOffset
void printColumnWithOffset(Tpcm &_pcm, std::ostream &_fout, const int _width=20)
print data of class members with pos and vel offset using column style
Definition: ptcl.hpp:131
ChangeOver::getRout
const Float & getRout() const
get r_out
Definition: changeover.hpp:94
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
GroupDataDeliver::mass
PS::F32 mass
Definition: ptcl.hpp:19
PIKG::max
T max(const Vector3< T > &v)
Definition: pikg_vector.hpp:143
ParticleBase::print
void print(std::ostream &fout) const
for print debugging
Definition: particle_base.hpp:196
ArtificialParticleInformation::readAscii
void readAscii(FILE *_fin)
read class data with ASCII format
Definition: artificial_particles.hpp:203
artificial_particles.hpp
Ptcl::readAscii
void readAscii(FILE *_fin)
read class data with ASCII format
Definition: ptcl.hpp:168
GroupDataDeliver::artificial
ArtificialParticleInformation artificial
Definition: ptcl.hpp:18
ChangeOver::print
void print(std::ostream &_fout) const
Definition: changeover.hpp:98
ArtificialParticleInformation::isMember
bool isMember() const
return whether the particle type is member
Definition: artificial_particles.hpp:41
Ptcl::Ptcl
Ptcl()
Definition: ptcl.hpp:49
Ptcl::getRGroup
PS::F64 getRGroup() const
Get group distance criterion.
Definition: ptcl.hpp:254
ChangeOver::readAscii
void readAscii(FILE *_fin)
read class data to file with binary format
Definition: changeover.hpp:168
Ptcl::Ptcl
Ptcl(const Tptcl &_p, const PS::F64 _r_search, const PS::S64 _id, const GroupDataDeliver &_group_data, const ChangeOver &_co)
Definition: ptcl.hpp:55
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
GroupDataDeliver::data2
PS::S64 data2
Definition: ptcl.hpp:20
ParticleBase::writeAscii
void writeAscii(FILE *fp) const
write class data with ASCII format
Definition: particle_base.hpp:150
Ptcl::search_factor
static PS::F64 search_factor
Definition: ptcl.hpp:42
ParticleBase::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: particle_base.hpp:243
Ptcl::id
PS::S64 id
Definition: ptcl.hpp:39
Ptcl::getParticleCMAddress
PS::S64 getParticleCMAddress() const
get c.m. particle address
Definition: ptcl.hpp:215
Ptcl::r_group_crit_ratio
static PS::F64 r_group_crit_ratio
Definition: ptcl.hpp:44
Ptcl::group_data
GroupDataDeliver group_data
Definition: ptcl.hpp:40
Ptcl::readBinary
void readBinary(FILE *_fin)
read class data with BINARY format
Definition: ptcl.hpp:194
GroupDataDeliver::data1
PS::S64 data1
Definition: ptcl.hpp:20
ArtificialParticleInformation::setStatus
void setStatus(const PS::F64 _status)
set status
Definition: artificial_particles.hpp:127
PIKG::F32
float F32
Definition: pikg_vector.hpp:18
ParticleBase::readAscii
void readAscii(FILE *fp)
read class data with ASCII format
Definition: particle_base.hpp:161
particle_base.hpp
ArtificialParticleInformation
class to store necessary information for using artificial particles
Definition: artificial_particles.hpp:20
Ptcl::print
void print(std::ostream &_fout) const
Definition: ptcl.hpp:72