PeTar
N-body code for collisional gravitational systems
particle_base.hpp
Go to the documentation of this file.
1 #pragma once
2 #ifdef BSE_BASE
3 #include "bse_interface.h"
4 #endif
5 #ifdef NAN_CHECK_DEBUG
6 #ifndef NAN_CHECK
7 #define NAN_CHECK(val) assert((val) == (val));
8 #endif
9 #endif
10 
11 #ifdef BSE_BASE
12 enum class BinaryInterruptState:int {none = 0, form = 1, type_change = 2, start_roche = 3, end_roche = 4, contact = 5, start_symbiotic = 6, end_symbiotic = 7, common_envelope = 8 , giant = 9, collision = 10, blue_straggler = 11, no_remain = 12, disrupt = 13, tide = 14};
13 #else
14 enum class BinaryInterruptState:int {none = 0, form = 1, exchange = 2, collision = 3};
15 #endif
16 #define BINARY_STATE_ID_SHIFT 4
17 #define BINARY_INTERRUPT_STATE_MASKER 0xF
18 
21 public:
22  // necessary variables, should not be touched
26  PS::S64 binary_state; // contain two parts, low bits (first BINARY_STATE_ID_SHIFT bits) is binary interrupt state and high bits are pair ID
27 #ifdef STELLAR_EVOLUTION
28  // for stellar evolution
29  PS::F64 radius;
30  PS::F64 dm;
31  PS::F64 time_record;
32  PS::F64 time_interrupt;
33 #ifdef BSE_BASE
34  StarParameter star; // SSE/BSE based package stellar parameters
35 #endif
36 #endif
37 
39  void setBinaryPairID(const PS::S64 _id) {
41  }
42 
46  }
47 
51  }
52 
56  }
57 
58  // -------------------------
59 
61  ParticleBase(): mass(0.0) {
62  binary_state = 0;
63 #ifdef STELLAR_EVOLUTION
64  radius = 0.0;
65  dm = 0.0;
66  time_record = 0.0;
67  time_interrupt = 0.0;
68 #endif
69  }
70 
71  template<class Tp>
72  ParticleBase(const Tp &p) { DataCopy(p);}
73 
75  ParticleBase(const PS::F64 _mass,
76  const PS::F64vec & _pos,
77  const PS::F64vec & _vel): mass(_mass), pos(_pos), vel(_vel) {
78  binary_state = 0;
79 #ifdef STELLAR_EVOLUTION
80  radius = 0.0;
81  dm = 0.0;
82  time_record = 0.0;
83  time_interrupt = 0.0;
84 #ifdef BSE_BASE
85  star.initial(0.0);
86 #endif
87 #endif
88  }
89 
90 #ifdef STELLAR_EVOLUTION
91 #ifdef BSE_BASE
92  ParticleBase(const PS::F64 _mass, const PS::F64vec & _pos, const PS::F64vec & _vel, const PS::S64 _binary_state,
94  const PS::F64 _radius, const PS::F64 _dm,
95  const PS::F64 _time_record, const PS::F64 _time_interrupt, const StarParameter& _star):
96  mass(_mass), pos(_pos), vel(_vel), binary_state(_binary_state), radius(_radius), dm(_dm),
97  time_record(_time_record), time_interrupt(_time_interrupt), star(_star) {}
98 #else
99  ParticleBase(const PS::F64 _mass, const PS::F64vec & _pos, const PS::F64vec & _vel, const PS::S64 _binary_state,
101  const PS::F64 _radius, const PS::F64 _dm,
102  const PS::F64 _time_record, const PS::F64 _time_interrupt):
103  mass(_mass), pos(_pos), vel(_vel), binary_state(_binary_state), radius(_radius), dm(_dm),
104  time_record(_time_record), time_interrupt(_time_interrupt) {}
105 #endif
106 #else
107  ParticleBase(const PS::F64 _mass, const PS::F64vec & _pos, const PS::F64vec & _vel, const PS::S64 _binary_state):
109  mass(_mass), pos(_pos), vel(_vel), binary_state(_binary_state) {}
110 #endif
111 
112 #ifdef STELLAR_EVOLUTION
113 
116  void writeAscii(FILE* fp) const{
117  fprintf(fp, "%26.17e %26.17e %26.17e %26.17e %26.17e %26.17e %26.17e %lld %26.17e %26.17e %26.17e %26.17e ",
118  this->mass,
119  this->pos.x, this->pos.y, this->pos.z,
120  this->vel.x, this->vel.y, this->vel.z,
121  this->binary_state, this->radius, this->dm, this->time_record, this->time_interrupt);
122 #ifdef BSE_BASE
123  star.writeAscii(fp);
124 #endif
125  }
126 
128 
130  void readAscii(FILE* fp) {
131  PS::S64 rcount=fscanf(fp, "%lf %lf %lf %lf %lf %lf %lf %lld %lf %lf %lf %lf",
132  &this->mass,
133  &this->pos.x, &this->pos.y, &this->pos.z,
134  &this->vel.x, &this->vel.y, &this->vel.z,
135  &this->binary_state,
136  &this->radius, &this->dm, &this->time_record, &this->time_interrupt);
137  if(rcount<12) {
138  std::cerr<<"Error: Data reading fails! requiring data number is 12, only obtain "<<rcount<<".\n";
139  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";
140  abort();
141  }
142 #ifdef BSE_BASE
143  star.readAscii(fp);
144 #endif
145  }
146 #else
147 
150  void writeAscii(FILE* fp) const{
151  fprintf(fp, "%26.17e %26.17e %26.17e %26.17e %26.17e %26.17e %26.17e %lld",
152  this->mass,
153  this->pos.x, this->pos.y, this->pos.z,
154  this->vel.x, this->vel.y, this->vel.z,
155  this->binary_state);
156  }
157 
159 
161  void readAscii(FILE* fp) {
162  PS::S64 rcount=fscanf(fp, "%lf %lf %lf %lf %lf %lf %lf %lld",
163  &this->mass,
164  &this->pos.x, &this->pos.y, &this->pos.z,
165  &this->vel.x, &this->vel.y, &this->vel.z,
166  &this->binary_state);
167  if(rcount<8) {
168  std::cerr<<"Error: Data reading fails! requiring data number is 7, only obtain "<<rcount<<".\n";
169  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";
170  abort();
171  }
172  }
173 #endif
174 
176 
178  void writeBinary(FILE* fp) const{
179  fwrite(&(this->mass), sizeof(ParticleBase), 1, fp);
180  }
181 
182 
184 
186  void readBinary(FILE* fp) {
187  size_t rcount=fread(&(this->mass), sizeof(ParticleBase), 1, fp);
188  if(rcount<1) {
189  std::cerr<<"Error: Data reading fails! requiring data number is 1, only obtain "<<rcount<<".\n";
190  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";
191  abort();
192  }
193  }
194 
196  void print(std::ostream & fout) const{
197  fout<<" mass="<<mass
198  <<" pos="<<pos
199  <<" vel="<<vel
200  <<" binary_state="<<binary_state;
201 #ifdef STELLAR_EVOLUTION
202  fout<<" radius="<<radius
203  <<" dm="<<dm
204  <<" time_record="<<time_record
205  <<" time_interrupt="<<time_interrupt;
206 #ifdef BSE_BASE
207  star.print(fout);
208 #endif
209 #endif
210  }
211 
213 
217  static void printColumnTitle(std::ostream & _fout, const int _width=20) {
218  _fout<<std::setw(_width)<<"mass"
219  <<std::setw(_width)<<"pos.x"
220  <<std::setw(_width)<<"pos.y"
221  <<std::setw(_width)<<"pos.z"
222  <<std::setw(_width)<<"vel.x"
223  <<std::setw(_width)<<"vel.y"
224  <<std::setw(_width)<<"vel.z"
225  <<std::setw(_width)<<"bin_stat";
226 #ifdef STELLAR_EVOLUTION
227  _fout<<std::setw(_width)<<"radius"
228  <<std::setw(_width)<<"dm"
229  <<std::setw(_width)<<"t_record"
230  <<std::setw(_width)<<"t_interrupt";
231 #ifdef BSE_BASE
232  StarParameter::printColumnTitle(_fout, _width);
233 #endif
234 #endif
235  }
236 
238 
243  static int printTitleWithMeaning(std::ostream & _fout, const int _counter=0, const int _offset=0) {
244  int counter = _counter;
245  counter++;
246  _fout<<std::setw(_offset)<<" "<<counter<<". mass: mass of particle\n";
247  counter++;
248  _fout<<std::setw(_offset)<<" "<<counter<<"-"<<counter+2<<". pos.[x/y/z]: 3D position of particle\n";
249  counter+=3;
250  _fout<<std::setw(_offset)<<" "<<counter<<"-"<<counter+2<<". vel.[x/y/z]: 3D velocity of particle\n";
251  counter+=3;
252  _fout<<std::setw(_offset)<<" "<<counter<<". bin_stat: binary status storing pair id and status [formatted] (0.0)\n";
253 #ifdef STELLAR_EVOLUTION
254  counter++;
255  _fout<<std::setw(_offset)<<" "<<counter<<". radius: stellar radius for merger checker (0.0)\n";
256  counter++;
257  _fout<<std::setw(_offset)<<" "<<counter<<". dm: mass change (0.0)\n";
258  counter++;
259  _fout<<std::setw(_offset)<<" "<<counter<<". t_record: time record of last check (0.0)\n";
260  counter++;
261  _fout<<std::setw(_offset)<<" "<<counter<<". t_interrupt: time for next evolution check (0.0)\n";
262 #ifdef BSE_BASE
263  counter = StarParameter::printTitleWithMeaning(_fout, counter, _offset);
264 #endif
265 #endif
266  return counter;
267  }
268 
270 
274  void printColumn(std::ostream & _fout, const int _width=20) const{
275  _fout<<std::setw(_width)<<mass
276  <<std::setw(_width)<<pos.x
277  <<std::setw(_width)<<pos.y
278  <<std::setw(_width)<<pos.z
279  <<std::setw(_width)<<vel.x
280  <<std::setw(_width)<<vel.y
281  <<std::setw(_width)<<vel.z
282  <<std::setw(_width)<<binary_state;
283 #ifdef STELLAR_EVOLUTION
284  _fout<<std::setw(_width)<<radius
285  <<std::setw(_width)<<dm
286  <<std::setw(_width)<<time_record
287  <<std::setw(_width)<<time_interrupt;
288 #ifdef BSE_BASE
289  star.printColumn(_fout, _width);
290 #endif
291 #endif
292  }
293 
295 
300  template <class Tpcm>
301  void printColumnWithOffset(Tpcm& _pcm, std::ostream & _fout, const int _width=20) const{
302  _fout<<std::setw(_width)<<mass
303  <<std::setw(_width)<<pos.x + _pcm.pos.x
304  <<std::setw(_width)<<pos.y + _pcm.pos.y
305  <<std::setw(_width)<<pos.z + _pcm.pos.z
306  <<std::setw(_width)<<vel.x + _pcm.vel.x
307  <<std::setw(_width)<<vel.y + _pcm.vel.y
308  <<std::setw(_width)<<vel.z + _pcm.vel.z
309  <<std::setw(_width)<<binary_state;
310 #ifdef STELLAR_EVOLUTION
311  _fout<<std::setw(_width)<<radius
312  <<std::setw(_width)<<dm
313  <<std::setw(_width)<<time_record
314  <<std::setw(_width)<<time_interrupt;
315 #ifdef BSE_BASE
316  star.printColumn(_fout, _width);
317 #endif
318 #endif
319  }
320 
321 
323 
326  template<class Tp>
327  void DataCopy(const Tp & din) {
328  mass = din.mass;
329  pos = din.pos;
330  vel = din.vel;
331  binary_state = din.binary_state;
332 #ifdef STELLAR_EVOLUTION
333  radius= din.radius;
334  dm = din.dm;
335  time_record = din.time_record;
336  time_interrupt = din.time_interrupt;
337 #ifdef BSE_BASE
338  star = din.star;
339 #endif
340 #endif
341  }
342 
344 
347  return mass;
348  }
349 
351 
354  return &pos.x;
355  }
356 
358 
361  return &vel.x;
362  }
363 
365 
370  void setPos(const PS::F64 x, const PS::F64 y, const PS::F64 z) {
371 #ifdef NAN_CHECK_DEBUG
372  NAN_CHECK(x);
373  NAN_CHECK(y);
374  NAN_CHECK(z);
375 #endif
376  pos.x = x;
377  pos.y = y;
378  pos.z = z;
379  }
380 
382  void setPos(const PS::F64vec & _pos) {pos = _pos;}
383 
385 
390  void setVel(const PS::F64 vx, const PS::F64 vy, const PS::F64 vz) {
391 #ifdef NAN_CHECK_DEBUG
392  NAN_CHECK(vx);
393  NAN_CHECK(vy);
394  NAN_CHECK(vz);
395 #endif
396 
397  vel.x = vx;
398  vel.y = vy;
399  vel.z = vz;
400  }
401 
403  void setVel(const PS::F64vec & _vel) {vel = _vel;};
404 
406 
409  void setMass(const PS::F64 m) {
410 #ifdef NAN_CHECK_DEBUG
411  NAN_CHECK(m);
412 #endif
413 
414  mass = m;
415  }
416 };
ParticleBase::writeBinary
void writeBinary(FILE *fp) const
write class data with BINARY format
Definition: particle_base.hpp:178
galpy_pot_movie.fp
fp
Definition: galpy_pot_movie.py:131
ParticleBase
Basic particle class.
Definition: particle_base.hpp:20
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
PIKG::F64vec
Vector3< F64 > F64vec
Definition: pikg_vector.hpp:167
BINARY_STATE_ID_SHIFT
#define BINARY_STATE_ID_SHIFT
Definition: particle_base.hpp:16
BinaryInterruptState::form
@ form
ParticleBase::readBinary
void readBinary(FILE *fp)
read class data with BINARY format
Definition: particle_base.hpp:186
ParticleBase::binary_state
PS::S64 binary_state
Definition: particle_base.hpp:26
bse_interface.h
BinaryInterruptState
BinaryInterruptState
Definition: particle_base.hpp:14
StarParameter::printColumn
void printColumn(std::ostream &_fout, const int _width=20) const
print data of class members using column style
Definition: bse_interface.h:345
StarParameter::readAscii
void readAscii(FILE *fp)
read class data with ASCII format
Definition: bse_interface.h:299
ParticleBase::ParticleBase
ParticleBase()
defaulted constructor
Definition: particle_base.hpp:61
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
BinaryInterruptState::exchange
@ exchange
ParticleBase::pos
PS::F64vec pos
Definition: particle_base.hpp:24
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
NAN_CHECK
#define NAN_CHECK(val)
Definition: hard_test.cxx:18
BINARY_INTERRUPT_STATE_MASKER
#define BINARY_INTERRUPT_STATE_MASKER
Definition: particle_base.hpp:17
ParticleBase::getMass
PS::F64 getMass()
Get mass (required for ARC::chain)
Definition: particle_base.hpp:346
BinaryInterruptState::none
@ none
ParticleBase::setPos
void setPos(const PS::F64 x, const PS::F64 y, const PS::F64 z)
Set position (required for ARC::chain)
Definition: particle_base.hpp:370
ParticleBase::setPos
void setPos(const PS::F64vec &_pos)
Set position (used in soft part)
Definition: particle_base.hpp:382
ParticleBase::ParticleBase
ParticleBase(const Tp &p)
Definition: particle_base.hpp:72
ParticleBase::setBinaryInterruptState
void setBinaryInterruptState(const BinaryInterruptState _state)
save binary interrupt state in the first BINARY_STATE_ID_SHIFT bit in binary_state
Definition: particle_base.hpp:44
ParticleBase::DataCopy
void DataCopy(const Tp &din)
Copy from another ParticleBase.
Definition: particle_base.hpp:327
StarParameter::initial
void initial(double _mass, int _kw=1, double _ospin=0.0, double _epoch=0.0)
Landmark luminosities
Definition: bse_interface.h:276
ParticleBase::setMass
void setMass(const PS::F64 m)
Set mass (required for ARC::chain)
Definition: particle_base.hpp:409
StarParameter::printColumnTitle
static void printColumnTitle(std::ostream &_fout, const int _width=20)
print titles of class members using column style
Definition: bse_interface.h:327
ParticleBase::getPos
PS::F64 * getPos()
Get position (required for ARC::chain)
Definition: particle_base.hpp:353
ParticleBase::getBinaryInterruptState
BinaryInterruptState getBinaryInterruptState() const
get binary interrupt state from binary_state
Definition: particle_base.hpp:49
ParticleBase::mass
PS::F64 mass
Definition: particle_base.hpp:23
ParticleBase::print
void print(std::ostream &fout) const
for print debugging
Definition: particle_base.hpp:196
ParticleBase::ParticleBase
ParticleBase(const PS::F64 _mass, const PS::F64vec &_pos, const PS::F64vec &_vel)
constructor
Definition: particle_base.hpp:75
StarParameter::writeAscii
void writeAscii(FILE *fp) const
write class data with ASCII format
Definition: bse_interface.h:291
ParticleBase::getBinaryPairID
PS::S64 getBinaryPairID() const
get pair ID from binary_state
Definition: particle_base.hpp:54
BinaryInterruptState::collision
@ collision
ParticleBase::writeAscii
void writeAscii(FILE *fp) const
write class data with ASCII format
Definition: particle_base.hpp:150
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
ParticleBase::getVel
PS::F64 * getVel()
Get velocity (required for ARC::chain)
Definition: particle_base.hpp:360
StarParameter::print
void print(std::ostream &fout) const
for print in one line
Definition: bse_interface.h:309
ParticleBase::setBinaryPairID
void setBinaryPairID(const PS::S64 _id)
save pair id in binary_state with shift bit size of BINARY_STATE_ID_SHIFT
Definition: particle_base.hpp:39
ParticleBase::readAscii
void readAscii(FILE *fp)
read class data with ASCII format
Definition: particle_base.hpp:161
StarParameter::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: bse_interface.h:364
ParticleBase::setVel
void setVel(const PS::F64 vx, const PS::F64 vy, const PS::F64 vz)
Set velocity (required for ARC::chain)
Definition: particle_base.hpp:390
ParticleBase::setVel
void setVel(const PS::F64vec &_vel)
Set velocity.
Definition: particle_base.hpp:403
StarParameter
SSE/BSE based code star parameter for saving.
Definition: bse_interface.h:257